簡體   English   中英

如何使用調試器處理任務中的異常?

[英]How to handle exceptions in Tasks with debugger?

在MSDN上研究了這篇文章 ,以及關於此主題的一些SO問題/解答,但無法弄清楚為什么下面的代碼不起作用(在示例控制台應用程序中)。

根據MSDN,預計將引發AggregateException,該異常將包含一個帶有hello消息的內部異常。 而是,未處理此hello異常。 它發生在調試器中。

如果按繼續或獨立運行,它將按預期運行。 有什么方法可以避免在VS中一直按下繼續鍵嗎? 畢竟,無論是內部Try...Catch塊被認為是在單線程編程模型來處理 否則,調試可能是一場噩夢。

VB.NET

Sub Main()
  Try
    Task.Factory.StartNew(AddressOf TaskThatThrowsException).Wait()
  Catch ex As AggregateException
    Console.WriteLine(ex.ToString) 'does not get here until you hit Continue
  End Try
End Sub

Private Sub TaskThatThrowsException()
  Throw New Exception("hello") 'exception was unhandled
End Sub

C#

namespace ConsoleApplication1 {
  class Program {
    static void Main(string[] args) {
      try {
        Task.Factory.StartNew(TaskThatThrowsException).Wait();
      }
      catch (AggregateException ex) {
        Console.WriteLine(ex.ToString()); //never gets here                
      }
    }

    static void TaskThatThrowsException() {
      throw new Exception("hello"); //exception was unhandled            
    }
  }
}

有什么明顯的我想念的地方嗎?

這很可能是因為您誤解了Visual Studio對話框的內容。

異常是“用戶未處理”,因為沒有用戶代碼可以捕獲它(原始Exception ),所以它被TPL捕獲。 因此,如果讓調試器繼續運行,或者在沒有調試器的情況下運行應用程序,則會看到您期望的行為。

設置“僅啟用我的代碼”對此有影響。 在“工具”->“選項”,“調試”->“常規”->“啟用我的代碼”下。 如果您將其打開,那么如果您的代碼不處理該異常,它將認為該異常未處理。 嘗試關閉此選項。

請參閱: http//msdn.microsoft.com/en-us/library/dd997415.aspx

暫無
暫無

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

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