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

fsi0uk1n  于 2023-06-23  发布在  其他
关注(0)|答案(3)|浏览(143)

当调试器附加到.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()中的异常?

uqcuzwp8

uqcuzwp81#

Debug菜单下,选择Exceptions...。在“例外”对话框中,选中Common Language Runtime Exceptions行旁边的Thrown框。
对于VS2022…选择“Debug”“Windows”“Exceptions Settings”,然后选中Common Language Runtime Exceptions左侧的复选框。

8wigbo56

8wigbo562#

我想知道是否有人知道如何解决这个问题?也许是最新的Visual Studio中的一个设置...?
一个讨厌但可行的解决方案(在我的情况下)是抛出我自己的 custom Exception,然后修改Stephen Cleary的答案:

  • 在“调试”菜单下,选择“异常”(您可以使用此键盘快捷键Control + Alt + E)...在“异常”对话框中,选中“公共语言运行库异常”行旁边的“抛出”框。*

更具体地说,将您的 custom Exception添加到列表中,然后勾选其“抛出”框。
例如:

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

cotxawn73#

我已经将匿名委托 Package 在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
     }

});

相关问题