【譯】Exception Helper – Rethrown Exceptions
是否曾經在非同步編程時引發過異常?因為調試器沒有顯示異常發生的位置而感到沮喪?或者在查看具有內部異常的異常時感到沮喪?調試器不容易顯示該異常來自何處。從 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 快照捕獲應用程式的整個狀態,您可以通過局部變數和監視窗口檢查應用程式中的任何內容。
原文鏈接
//devblogs.microsoft.com/visualstudio/exception-helper-rethrown-exceptions/

