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

Seb*_*ski 58 c# debugging exception visual-studio-debugging async-await

当调试器附加到.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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ary 37

Debug菜单下,选择Exceptions....在"例外"对话框中,Common Language Runtime Exceptions选中该行旁边的行Thrown.

  • 好的,我确实知道.但是调试器会破坏所有*异常,而不仅仅是未处理的异常,对吗?所以这并不是我想要的. (21认同)
  • 在Visual Studio 2015中,异常设置位于`Debug` >>`Windows` >>`Exception Settings`(Ctrl + Alt + E)下 (17认同)
  • @SebastianKrysmanski:但处理了异常.如果你有一个`async Task`方法,那么异常会被`async`状态机捕获并放在返回的`Task`上. (6认同)