【问题标题】:Async: How to break on exact line of code that has thrown the exception?异步:如何中断引发异常的确切代码行?
【发布时间】:2014-10-07 08:11:32
【问题描述】:

假设我有以下代码:

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

如果我随后在调试器选项中启用“仅我的代码”,它将改为在此处中断:

越来越近了。如果我随后在“异常”窗口 (Ctrl+Alt+E) 中的“Thrown”列下检查System.Exception,它将完全在我想要的位置中断:

但现在 Visual Studio 将中断所有抛出的异常,而不仅仅是未处理的异常。有没有办法让 Visual Studio 只针对未处理的异常在最合乎逻辑的代码行中中断,就像在常规的非异步代码中一样?如果这种行为是不可能的,那么:

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

我在此示例中使用了 3 个嵌套函数来强调我的代码可能很复杂,包含许多分支和嵌套方法调用,如果 Visual Studio 没有在最内层的行中断,则很难识别有问题的代码行代码。

【问题讨论】:

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


【解决方案1】:

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

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

其次,我在调试器选项中启用“仅我的代码”。

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

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

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

【讨论】:

  • Downvoter:请解释为什么这个答案不正确/差。它会帮助我和社区。​​span>
  • 启用我的代码就可以了!
  • 不适用于我的情况,我让异步方法遇到一些错误,但我在调用方法中忽略了。所以调用堆栈不显示任何东西。如果不是因为这个有缺陷的 await/asyn VS 会在错误的异步方法中停止
【解决方案2】:

这是不可能的。

为什么不可能?

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

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

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

【讨论】:

  • 谢谢,这些链接很有帮助。我想我只是感到困惑,因为 Visual Studio 在与最初引发异常的位置不同的位置中断。我认为这与在Task 对象中捕获的异常有关,然后仅在任务完成awaited 后才引发。在这种情况下,async void buttonClick 方法不会返回Task,因此await nested1() 行是异常未处理且无法传递给调用者的位置。我想我会去阅读一些 MSDN 文章...
  • 我刚刚尝试了 Decade Moon 的答案(启用 Just My Code),调试器停在异步代码中的正确位置,所以我会说这是可能的。它有时会在父等待而不是实际异常上停止,但我还没有弄清楚具体细节。
猜你喜欢
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2014-06-13
  • 2017-06-03
  • 2011-11-11
  • 1970-01-01
相关资源
最近更新 更多