8

在 MSDN 上研究了这篇文章,以及关于这个主题的一些问题/答案,但无法弄清楚为什么下面的代码不起作用(在示例控制台应用程序中)。

根据 MSDN,预计会抛出 AggregateException,其中包含一个带有hello消息的内部异常。相反,此hello异常未处理。它发生在调试器内部。

如果您按继续或独立运行,它会按预期工作。有什么办法可以避免在 VS 中一直按 continue 吗?毕竟,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            
    }
  }
}

我在这里有什么明显的遗漏吗?

4

2 回答 2

2

这很可能是因为您误解了 Visual Studio 对话框的含义。

异常是“用户未处理”,因为没有捕获它的用户代码(原始Exception),它被 TPL 捕获。因此,如果您让调试器继续运行,或者如果您在没有调试器的情况下运行应用程序,您将看到预期的行为。

于 2013-02-20T22:45:01.337 回答
2

“仅启用我的代码”设置对此有影响。在工具->选项下,调试->常规->启用仅我的代码。如果你打开它,如果你的代码没有处理它,它会认为异常未处理。尝试关闭此选项。

请参阅:http: //msdn.microsoft.com/en-us/library/dd997415.aspx

于 2013-02-21T19:06:45.730 回答