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