Visual Studio具有一定的功能,可以更轻松地调试未处理的异常:它会停止在有问题的代码行上并显示异常。
似乎Task
类的设计方式总是抑制此功能:它捕获每个异常,然后在任务Wait
或最终确定时重新抛出另一个异常。
我知道我可以让它停在第一次机会异常上,但这并不总是有帮助:想象在未处理的异常之前发生了许多相同类型的处理异常。在这种情况下,除了实际导致问题的异常之外,VS将停止每个无问题的异常。
另一个替代方案甚至更不可接受:只看InnerException
的堆栈跟踪:这意味着虽然我知道哪一行导致异常,但我无法访问其任何本地状态,就像我可以程序实际上就在那里停止了。
我可以使用Task
类以某种方式获得两全其美,但不必使用降级的异常调试功能集吗?
Bonus问题:这是否意味着await
块内的空引用异常不会导致Visual Studio在那里停止,而是会完全停在其他地方?
答案 0 :(得分:3)
Task
类型会将所有异常包装到AggregateException
中。但是,如果您使用async
/ await
功能,那么当您await
Task
时,内部异常将被解包并重新抛出,从而保留原始堆栈跟踪。
VS11将有更好的async
调试支持,但我认为不可能达到你所希望的那样。 Task
完全是关于并发和异步代码的,这就是为什么我认为这不会起作用。
例如,假设您在线程池线程上运行Task
,那么您将await
。您可以await
阻止try
阻止来自Task
的异常...或者您可以await
阻止try
阻止该异常<{1}}的例外是未处理的。
该示例的要点是,当抛出异常时,如果异常 未处理,调试器将不知道。使用同步代码,只要抛出异常,就会检查堆栈 - 如果未处理,调试器会知道它未处理,并且可以立即采取特殊操作(在堆栈被解除之前)。
所以,我认为不可能做你想做的事。你可以使用IntelliTrace非常接近(仅限VS Ultimate)。