我可以让Visual Studio停止在任务代码中的未处理异常吗?

时间:2012-01-26 10:15:16

标签: visual-studio-2010 debugging

Visual Studio具有一定的功能,可以更轻松地调试未处理的异常:它会停止在有问题的代码行上并显示异常。

似乎Task类的设计方式总是抑制此功能:它捕获每个异常,然后在任务Wait或最终确定时重新抛出另一个异常。

我知道我可以让它停在第一次机会异常上,但这并不总是有帮助:想象在未处理的异常之前发生了许多相同类型的处理异常。在这种情况下,除了实际导致问题的异常之外,VS将停止每个无问题的异常。

另一个替代方案甚至更不可接受:只看InnerException的堆栈跟踪:这意味着虽然我知道哪一行导致异常,但我无法访问其任何本地状态,就像我可以程序实际上就在那里停止了。

我可以使用Task类以某种方式获得两全其美,但不必使用降级的异常调试功能集吗?


Bonus问题:这是否意味着await块内的空引用异常不会导致Visual Studio在那里停止,而是会完全停在其他地方?

1 个答案:

答案 0 :(得分:3)

Task类型会将所有异常包装到AggregateException中。但是,如果您使用async / await功能,那么当您await Task时,内部异常将被解包并重新抛出,从而保留原始堆栈跟踪。

VS11将有更好的async调试支持,但我认为不可能达到你所希望的那样。 Task完全是关于并发和异步代码的,这就是为什么我认为这不会起作用。

例如,假设您在线程池线程上运行Task,那么您将await。您可以await阻止try阻止来自Task的异常...或者您可以await阻止try阻止该异常<{1}}的例外是未处理的。

该示例的要点是,当抛出异常时,如果异常 未处理,调试器将不知道。使用同步代码,只要抛出异常,就会检查堆栈 - 如果未处理,调试器会知道它未处理,并且可以立即采取特殊操作(在堆栈被解除之前)。

所以,我认为不可能做你想做的事。你可以使用IntelliTrace非常接近(仅限VS Ultimate)。