簡體   English   中英

調試器未捕獲異步異常

[英]Async exception not caught by debugger

我正在VS2013中開發一個MVC5項目。 我似乎發現調試器忽略了大多數(但不是全部)我的異常,因此我最終將異常和堆棧跟蹤簡單地寫入瀏覽器,從而排除了對所涉及的對象的任何檢查。例外。

例如 - 我故意編寫一個例外來證明這一點:

    <Authorize(Roles:="IdentityAdmin")>
Public Async Function Import(model As RegisterViewModel) As Task(Of ActionResult)
    Dim a As Object = "he"
    Dim b As Integer = a

顯然,最后一行會引發“類型不匹配”異常,我認為應該導致調試器停止執行,突出顯示VS2013 UI中的錯誤,使我能夠檢查各種對象並確定問題。

相反,我只是發現自己在瀏覽器中詳細說明了異常並且VS2013沒有響應:

'/'應用程序中的服務器錯誤。

輸入字符串的格式不正確。

描述:執行當前Web請求期間發生未處理的異常。 請查看堆棧跟蹤以獲取有關錯誤及其源自代碼的位置的更多信息。

異常詳細信息:System.FormatException:輸入字符串的格式不正確。

來源錯誤:

第291行:如果Db.Users.Find(acct.username)則為Nothing

第292行:將物體變暗=“他”

第293行:Dim b As Integer = a

當我將相同的異常生成代碼插入到代碼的非異步部分時,VS調試器捕獲異常 - 所以我猜這是調試異步代碼的問題。 VS調試器是否真的無法捕獲這些異常?

UPDATE

進一步搜索后,我遇到了一個禁用“Just My Code”並手動啟用各種異常的建議。 有一個預期的第一次機會異常的冰雹,其中大多數我可以通過禁用某些例外來調整。 但是這個DID “修復”了上面描述的行為。 似乎調試器將我的子異步線程視為'Not My Code'。 有點困惑,但我想這可能是各種各樣的答案?

根據上面的更新,問題中詳述的問題行為似乎可以通過以下組合來解決:

  • 在調試器選項中關閉“Just My Code”。
  • 在Debug / Exceptions中啟用某些類別的異常。 - 在我的例子中,公共語言運行時異常和托管調試助手似乎確保調試器捕獲了我的所有異常(異步或其他)。
  • 禁用拋出(但不起眼)的異常導致最悲傷(錯誤的全球化等)。

最后兩個階段是通過反復試驗發生的,我懷疑當我清理項目時,我最終應該追逐大部分非破壞性異常。

在這種情況下,禁用“僅我的代碼”應該沒有區別,啟用“拋出異常時中斷”是您希望調試器停在正確位置的內容。

問題在於,當您創建方法Async時,它在后台任務中運行。 任務將捕獲它正在執行的代碼中發生的任何異常,並將該異常重新拋出到任務使用任務的任何內容。 例如,如果您有以下MVC代碼

Async Function Index() As Task(Of ActionResult)
    Dim n as Integer = Await Method1()
    Return View()
End Function

Async Function Method1() As Task(Of Integer)
   Dim a As Integer = 0
   Dim b As Integer = 1 / b
   Return b
End Function

執行Method1內部代碼的任務將捕獲異常,並將其拋出到Index中,因為它使用的是Method1的結果,然后執行索引的任務將捕獲該異常並將其重新拋出到使用該異常的MVC框架代碼中。索引的結果,然后MVC框架處理異常並顯示錯誤頁面。

當啟用“僅我的代碼”並且方法同步執行時,如果異常從用戶代碼傳播出來並且消息“用戶未處理”,調試器將停止。 在上面的情況下,如果異常從Index傳播到不是您的代碼的MVC框架,則調試器將在啟用JMC時停止。 因為在異步方法的情況下,異常不是未處理但被Task捕獲,所以它不會超出用戶代碼,因此禁用Just My代碼不會產生任何影響。

相反的是,如果同步方法中發生異常並且您已禁用Just My Code,則調試器無論如何也不會停止,因為當禁用JMC並且MVC框架最終將處理時,沒有“User Unhandled”的概念那個例外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM