5

说我有下面的代码:异步:如何在引发异常的确切代码行中断开?

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.gics:

enter image description here

如果我然后启用调试器选项“仅我的代码”,它会而不是打破这里:

enter image description here

亲近。如果我再检查System.Exception在例外窗口(按Ctrl + Alt + E)的“时抛出”栏下,它会破坏正是我想要的:

enter image description here

但现在Visual Studio将打破统统抛到例外,而不仅仅是未处理的。有没有什么办法可以使Visual Studio在只处理未处理的异常的最合理的代码行中断开,就像它在常规的非异步代码中一样?如果这种行为是不可能的,那么:

  • 为什么不可能?
  • 如何识别引发异常的代码行,无论是我自己的代码的throw语句,还是引发异常的框架方法调用?

我这里用3个嵌套函数在这个例子中强调的是,我的代码可能是复杂设有多家分支机构和嵌套方法调用,并确定有问题的代码行是困难的,如果Visual Studio中没有打破最内层的代码行。

+1

相关 - http://stackoverflow.com/questions/18958950/how-can-i-make-vs-break-on-exceptions-in-an-async-task-without-breaking-on-all。 – 2014-10-07 08:24:24

回答

7

我想我可能已经发现了我的问题的答案。

首先,我在例外窗口(Ctrl + Alt + E)的“Thrown”列下取消选中System.Exception。我这样做是因为我不希望Visual Studio来上所有例外,只有未处理的人打破。

其次,我把“只要我的代码”中的调试器选项启用。

现在,当调试器中断,它会破坏这里:

enter image description here

按在我的问题的屏幕截图。但是,如果我检查调用堆栈:

enter image description here

其实我可以看到异常起源于(在nested3() 46行)。如果我在调用堆栈窗口中单击此条目,Visual Studio将跳转到正确的行,并且“本地”窗口甚至会显示该框架中局部变量的值。凉!我认为这是我想要的。

+1

Downvoter:请解释为什么这个答案不正确/差。它会帮助我和社区。 – 2014-10-07 11:33:31

+0

启用Just My Code就可以了! – 2016-04-05 10:03:38

4

这是不可能的。

为什么不可能?

因为它还没有完成。 async在每个发行版中仍然会获得更好的工具支持,而且我确实希望迟早会添加此行为。

如何识别引发异常的代码行,无论是我自己代码的throw语句还是引发异常的框架方法调用?

Visual Studio 2013确实有能力view asynchronous causality stacks in the debugger。如果你想在运行时有类似的行为,那么你可以使用我的async diagnostics package

+0

谢谢,这些链接是有帮助的。我想我只是感到困惑,因为Visual Studio正在与最初引发例外的位置不同。我认为这与“任务”对象中捕获到的异常有关,然后只有在任务“等待”后才会引发异常。在这种情况下,'async void buttonClick'方法不会返回'Task',所以'await nested1()'行是异常处理未处理的地方,不能传递给调用者。我想我会去读一些MSDN文章... – 2014-10-07 12:49:52

+0

我刚刚尝试了Decade Moon的答案(启用Just My Code),调试器停在异步代码中的正确位置,所以我会说这是可能的。它有时会停在父母的等待中,而不是实际的例外,但我还没有弄清楚具体细节。 – 2016-04-05 10:12:30