【问题标题】:how to debug exceptions when using async methods使用异步方法时如何调试异常
【发布时间】:2018-11-18 20:25:01
【问题描述】:

在 asp.net MVC 中,当我调试和单步执行代码时,调试器将停在有问题的行并显示抛出的异常,而该行不在 try..catch 中。但是,当使用 await..async 的行时,调试器不会暂停,并且在我有机会在调试器中看到它之前,异常只是作为响应返回。 VS2017中是否有设置,可以在调用异步方法时暂停调试器并检查此异常?

【问题讨论】:

  • 这些是 async Task 还是 async void 方法?
  • 你能提供一点代码吗?请记住,在调试时只有 UI 线程上的错误会被 VS 调试器捕获。处理错误时,您必须记住错误被抛出的线程。
  • @JStevens 在将有问题的 await 行放在 try 块中调用异步方法时,我能够捕获异常。所以我不确定为什么调试器不能自己弄清楚,当一个特定的线程抛出异常时,它应该在调试器中显示异常并在那里暂停,而不是仅仅将它传递给响应。
  • 调试器正在 UI 线程中运行。这样想吧。调试器是你,你有 2 个孩子 T1 和 T2。 T1 在车里陪你去商场。与此同时,T2 和朋友一起去看电影。 T2 不在您的车内。你不知道他真正在做什么。你只知道你告诉他做什么。你不是为了抓住他的错误。
  • 是的,这是有道理的。那么有没有办法告诉调试器附加到特定线程?

标签: c# asp.net-mvc async-await visual-studio-2017


【解决方案1】:

只需按F9,提前在所需方法中手动放置一个断点。该方法中的第一行代码是一个很好的逻辑位置。然后启动调试器并按照您的方式执行通常的 F10F5。在某个时间点(您无法控制),您会在所需的时间点停下来。

【讨论】:

  • 我不是在问如何调试。我在问如何在调试时查看异常。
  • 您应该能够像任何其他异常一样从 await..async 执行中捕获异常,只要确保您使用的是 awaitWait(),这样异常实例就可以用于检查.或者,即使您有 catch() ,即没有明确的异常声明,您也可以简单地在 VS 的监视窗口中添加 $exception 并以相同的方式进行检查。
  • 是的,但这就是我想避免的,只是为了调试而放入 try..catch
  • 我想我有点糊涂了。您想查看异常,但不喜欢在代码中使用 try..catch?考虑使用 try..catch 对单元测试进行编码。但是,如果您能够单步执行引发异常的代码,则可以在不使用 catch() 的情况下进行调试时观察到它。在VS中进入Options->Debug->General,打开“启用异常助手”。如前所述,您也没有指定您使用的是async void 还是async Task 签名。目前尚不清楚您是想以编程方式还是在调试会话中捕获/处理异常。
  • 我只是希望能够在我跨过代码时深入研究异常,如果我跨过的代码碰巧引发了异常。这正常工作,但它不适用于 async..await。
猜你喜欢
  • 1970-01-01
  • 2016-09-17
  • 2017-03-06
  • 2017-08-05
  • 2018-12-31
  • 2016-10-13
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多