调试器未中断/停止异步方法中的异常

本文关键字:异步方法 异常 中断 调试器 | 更新日期: 2023-09-27 18:26:34

当调试器附加到.NET进程时,它(通常)会在引发未处理的异常时停止。

然而,当您使用async方法时,这似乎不起作用。

以下代码列出了我以前尝试过的场景:

class Program
{
    static void Main()
    {
        // Debugger stopps correctly
        Task.Run(() => SyncOp());
        // Debugger doesn't stop
        Task.Run(async () => SyncOp());
        // Debugger doesn't stop
        Task.Run((Func<Task>)AsyncTaskOp);
        // Debugger stops on "Wait()" with "AggregateException"
        Task.Run(() => AsyncTaskOp().Wait());
        // Throws "Exceptions was unhandled by user code" on "await"
        Task.Run(() => AsyncVoidOp());
        Thread.Sleep(2000);
    }
    static void SyncOp()
    {
        throw new Exception("Exception in sync method");
    }
    async static void AsyncVoidOp()
    {
        await AsyncTaskOp();
    }
    async static Task AsyncTaskOp()
    {
        await Task.Delay(300);
        throw new Exception("Exception in async method");
    }
}

我是不是错过了什么?如何使调试器中断/停止AsyncTaskOp()中的异常?

调试器未中断/停止异步方法中的异常

Debug菜单下,选择Exceptions...。在"异常"对话框中,选中Common Language Runtime Exceptions行旁边的Thrown框。

对于VS2022。。。选择";调试"quot;Windows"异常设置";然后勾选CCD_ 7左侧的框。

我想听听是否有人知道如何解决这个问题?也许是在最新的视觉工作室里。。。?

一个讨厌但可行的解决方案(在我的情况下)是抛出我自己的自定义异常,然后修改Stephen Cleary的答案:

在"调试"菜单下,选择"异常"(您可以使用此键盘快捷键Control+Alt+E)。。。在"异常"对话框中,在"公共语言运行时异常"行旁边,检查"抛出"框

更具体地说,即,将自定义异常添加到列表中,然后勾选其"抛出"框。

例如:

async static Task AsyncTaskOp()
{
    await Task.Delay(300);
    throw new MyCustomException("Exception in async method");
}

我已经将匿名委托封装在Task.Run(() =>内部的try/catch中。

Task.Run(() => 
{
     try
     {
          SyncOp());
     }
     catch (Exception ex)
     {
          throw;  // <--- Put your debugger break point here. 
                  // You can also add the exception to a common collection of exceptions found inside the threads so you can weed through them for logging
     }
});