【譯】Exception Helper – Rethrown Exceptions

MeteorSeed發表於2020-07-08

  是否曾經在非同步程式設計時引發過異常?因為偵錯程式沒有顯示異常發生的位置而感到沮喪?或者在檢視具有內部異常的異常時感到沮喪?偵錯程式不容易顯示該異常來自何處。從 Visual Studio 2019 16.5 版本開始,異常幫助器現在包含了重新丟擲的異常的原始呼叫堆疊功能。這有助於找出程式碼中任何重新丟擲異常的根本原因。這在非同步異常的情況下尤其有用,非同步異常被框架程式碼捕獲並重新丟擲。

  上面的截圖來自一個簡單的程式,該程式使用'await'模式。

tatic async Task Main(string[] args)
{
    await a();
}
async static Task<string> a()
{
    return await b();
}
async static Task<string> b()
{
    return await c();
}
async static Task<string> c()
{
    string s = null;
    return await Task<string>.FromResult(s.ToLower());
}

  在本例中,異常在 s.ToLower() 處丟擲,異常在 await a() 處變為“未處理”,並且由於 await 在C#中的工作方式,偵錯程式將停止。不幸的是,所有有用的資訊都回到了 c() 中。現在,隨著 Visual Studio 2019 16.5 中的更改,您可以在呼叫堆疊中看到異常幫助器中最初丟擲異常的位置。

  在本例中,您可以單擊 Program.cs,連結並導航到呼叫堆疊頂部ConsoleApp5.Program.c()中的源位置,然後設定一個斷點,以便下次執行場景時命中。然後,當遇到斷點時,您將被停止在異常產生的位置,以及您可能希望進一步的除錯,並嘗試修改以修復問題。

  雖然可以使用此功能導航到正確的原始碼,但不能使用監視來檢查應用程式的狀態,就像最初丟擲異常時一樣。這僅僅是因為自那時起其他程式碼已經執行,這可能會改變應用程式的狀態。但是,如果您使用的是 Visual Studio 2019 Enterprise,則還有另一個選項 IntelliTrace。

IntelliTrace

  使用 IntelliTrace,VS 將在某些點捕獲應用程式的狀態,包括引發異常時,您可以返回並檢查以前的狀態。最簡單的方法是檢視診斷工具視窗的"事件"選項卡。在事件選項卡中,您將看到每個異常的事件。在此非同步示例中,每個非同步方法都有相應的引發和捕獲的異常事件。如果您單擊其中任何一個,IntelliTrace 會將偵錯程式帶回該時間點,您可以使用監視視窗檢查狀態。

  除了大多數例外情況外,您可能想要轉到第一個例項,因為那是它第一次引發的地方。值得一提的是,並不是所有的狀態都針對每個異常被捕獲,諸如區域性變數和引數之類。如果要在監視視窗中輸入新表示式,它可能不會計算。如果要捕獲應用程式的所有狀態,應啟用 IntelliTrace 快照功能。您可以通過訪問 Tools Options -> IntelliTrace 並啟用"IntelliTrace snapshots(managed and native)"來執行此操作,如下所示。

  使用 IntelliTrace 快照捕獲應用程式的整個狀態,您可以通過區域性變數和監視視窗檢查應用程式中的任何內容。

原文連結

  https://devblogs.microsoft.com/visualstudio/exception-helper-rethrown-exceptions/

相關文章