说我有以下代码:
async void buttonClick(object sender, RoutedEventArgs e)
{
await nested1();
}
async Task nested1()
{
await nested2();
}
async Task nested2()
{
await nested3();
}
async Task nested3()
{
await Task.Delay(1000);
throw new Exception("Die"); // <-- I want Visual Studio to break on this line
}
如果异常未处理,如何在指定的行上使Visual Studio中断?
通常在抛出异常时,Visual Studio将在App.g.i.cs中断开:
如果我然后启用&#34;只是我的代码&#34;在调试器选项中,它将在此处中断:
越来越近了。如果我然后检查&#34; Thrown&#34;下的System.Exception
在“例外”窗口中的列(Ctrl + Alt + E),它将完全打破我想要的位置:
但现在Visual Studio将打破所有抛出的异常,而不仅仅是未处理的异常。有没有办法让Visual Studio只针对未处理的异常打破最合乎逻辑的代码行,就像在常规的非异步代码中一样?如果无法执行此操作,则:
我在这个例子中使用了3个嵌套函数来强调我的代码可能很复杂,有许多分支和嵌套方法调用,如果Visual Studio没有破坏,识别有问题的代码行是很困难的在最里面的代码行。
答案 0 :(得分:9)
我想我可能已经找到了我的问题的答案。
首先,我在例外窗口的“Thrown”列下取消选中System.Exception
(Ctrl + Alt + E)。我之所以这样做,是因为我不希望Visual Studio在所有异常中断,只有未处理的异常。
其次,我在调试器选项中启用了“Just my code”。
现在,当调试器中断时,它将在此处中断:
根据我的问题中的截图。但是,如果我检查调用堆栈:
我实际上可以看到异常的起源(在nested3()
,第46行)。如果我在调用堆栈窗口中单击此条目,Visual Studio将跳转到正确的行,“Locals”窗口甚至会显示该框架中局部变量的值。凉!我想这就是我想要的。
答案 1 :(得分:4)
这是不可能的。
为什么不可能?
因为还没有完成。每个版本async
仍然会获得更好的工具支持,我希望迟早会添加此行为。
如何识别抛出异常的代码行,无论是我自己的代码的throw语句,还是抛出异常的框架方法调用?
Visual Studio 2013确实能够view asynchronous causality stacks in the debugger。如果您想在运行时使用类似的行为,那么您可以使用我的async diagnostics package。