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

Dec*_*oon 6 c# visual-studio async-await windows-store-apps 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
}
Run Code Online (Sandbox Code Playgroud)

只有在未处理异常时,如何才能使Visual Studio在指定的行中断?


通常,当抛出异常时,Visual Studio将在App.gics中断:

在此输入图像描述

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

在此输入图像描述

越来越接近.如果我然后System.Exception在"例外"窗口(Ctrl + Alt + E)中的"Thrown"列下进行检查,它将完全打破我想要的位置:

在此输入图像描述

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

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

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

Dec*_*oon 9

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

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

其次,我在调试器选项中启用了"Just my code".

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

在此输入图像描述

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

在此输入图像描述

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

  • Downvoter:请解释为什么这个答案不正确/差.它会帮助我和社区. (2认同)