调试器不会在异步方法中中断/停止异常

时间:2013-08-06 15:57:17

标签: c# debugging exception async-await visual-studio-debugging

当调试器附加到.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()

中中断/停止异常

3 个答案:

答案 0 :(得分:34)

Debug菜单下,选择Exceptions...。在“例外”对话框中,在Common Language Runtime Exceptions行旁边,选中Thrown框。

答案 1 :(得分:3)

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

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

  

在“调试”菜单下,选择“例外”(您可以使用此键盘快捷键控制 + Alt + E )...在“例外”对话框中,在“公共语言运行时例外”行旁边,选中“投掷”   框。

更具体一点,即将自定义例外添加到列表中,然后勾选其“投掷”框。

E.g:

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

答案 2 :(得分:-4)

我已将{匿名委托包装在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
     }

});