【譯】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()中的源位置,而後設置一個斷點,以便下次運行場景時命中。而後,當遇到斷點時,您將被中止在異常產生的位置,以及您可能但願進一步的調試,並嘗試修改以修復問題。async

  雖然可使用此功能導航到正確的源代碼,但不能使用監視來檢查應用程序的狀態,就像最初拋出異常時同樣。這僅僅是由於自那時起其餘代碼已經運行,這可能會改變應用程序的狀態。可是,若是您使用的是 Visual Studio 2019 Enterprise,則還有另外一個選項 IntelliTrace。異步編程

IntelliTrace

  使用 IntelliTrace,VS 將在某些點捕獲應用程序的狀態,包括引起異常時,您能夠返回並檢查之前的狀態。最簡單的方法是查看診斷工具窗口的"事件"選項卡。在事件選項卡中,您將看到每一個異常的事件。在此異步示例中,每一個異步方法都有相應的引起和捕獲的異常事件。若是您單擊其中任何一個,IntelliTrace 會將調試器帶回該時間點,您可使用監視窗口檢查狀態。工具

  除了大多數例外狀況外,您可能想要轉到第一個實例,由於那是它第一次引起的地方。值得一提的是,並非全部的狀態都針對每一個異常被捕獲,諸如局部變量和參數之類。若是要在監視窗口中輸入新表達式,它可能不會計算。若是要捕獲應用程序的全部狀態,應啓用 IntelliTrace 快照功能。您能夠經過訪問 Tools Options -> IntelliTrace 並啓用"IntelliTrace snapshots(managed and native)"來執行此操做,以下所示。spa

  使用 IntelliTrace 快照捕獲應用程序的整個狀態,您能夠經過局部變量和監視窗口檢查應用程序中的任何內容。調試

原文連接

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

相關文章
相關標籤/搜索