如果从异步方法抛出异常,则出现错误的异常

时间:2017-05-24 13:22:47

标签: c# .net asynchronous exception-handling .net-core

我创建了.NET Core控制台应用并在那里添加了一些异步魔法。但不知何故,来自异步方法的所有异常弹出窗口都出现在顶级main方法中(参见屏幕截图)。它使调试变得困难。我如何将它们移动到适当的位置?

现在怎么样: exception

我想在此处移动: enter image description here

1 个答案:

答案 0 :(得分:2)

调试器只会在异常未处理时中断,这意味着它周围没有进一步的catch块。这也是它将出现在生产日志中的地方!

异步方法在函数周围有一个“隐式”try-catch。当异步方法抛出异常时,它会被捕获并且只在等待方法时重新引入(“重新抛出”)到调用堆栈中(通过await关键字或通过.Result / .GetAwaiter().GetResult())。 这将创建一个“漂亮的”异步调用堆栈,其中包含多个异步方法的完整异常流程。

正如评论中所提到的,你可以将VS调试器设置为在抛出的异常时中断,但是这也会在任何地方打破异常即将被正确处理(它会破坏)在任何catch块可以运行之前)。