异步:如何打破抛出异常的确切代码行?

时间:2014-10-07 08:11:33

标签: c# visual-studio windows-store-apps async-await windows-phone-8.1

说我有以下代码:

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中断开:

enter image description here

如果我然后启用&#34;只是我的代码&#34;在调试器选项中,它将在此处中断:

enter image description here

越来越近了。如果我然后检查&#34; Thrown&#34;下的System.Exception在“例外”窗口中的列(Ctrl + Alt + E),它将完全打破我想要的位置:

enter image description here

但现在Visual Studio将打破所有抛出的异常,而不仅仅是未处理的异常。有没有办法让Visual Studio只针对未处理的异常打破最合乎逻辑的代码行,就像在常规的非异步代码中一样?如果无法执行此操作,则:

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

我在这个例子中使用了3个嵌套函数来强调我的代码可能很复杂,有许多分支和嵌套方法调用,如果Visual Studio没有破坏,识别有问题的代码行是很困难的在最里面的代码行。

2 个答案:

答案 0 :(得分:9)

我想我可能已经找到了我的问题的答案。

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

其次,我在调试器选项中启用了“Just my code”。

现在,当调试器中断时,它将在此处中断:

enter image description here

根据我的问题中的截图。但是,如果我检查调用堆栈:

enter image description here

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

答案 1 :(得分:4)

这是不可能的。

  

为什么不可能?

因为还没有完成。每个版本async仍然会获得更好的工具支持,我希望迟早会添加此行为。

  

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

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