如何使用调试程序处理任务中的异常?
我在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
}
}
}
有什么明显的我在这里失踪?
设置“启用我的代码”对此有影响。 在工具 - >选项,调试 - >常规 - >启用只是我的代码。 如果你打开了它,它会考虑如果你的代码没有处理它,未处理的异常。 尝试关闭此选项。
请参阅:http://msdn.microsoft.com/en-us/library/dd997415.aspx
这很可能是因为您误解了Visual Studio对话框所说的内容。
例外是“未处理用户”,因为没有捕获用户代码(原始Exception
),它被TPL捕获。 因此,如果让调试器继续运行,或者如果您在没有调试器的情况下运行应用程序,则会看到您期望的行为。
上一篇: How to handle exceptions in Tasks with debugger?
下一篇: How to make single admin to access single store products only