66

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

4

3 回答 3

37

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

于 2013-08-06T17:14:32.783 回答
3

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

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

在 Debug 菜单下,选择 Exceptions(您可以使用此键盘快捷键Control+ Alt+ E)... 在 Exceptions 对话框中,在 Common Language Runtime Exceptions 行旁边选中 Throw 框。

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

例如:

async static Task AsyncTaskOp()
{
    await Task.Delay(300);
    throw new MyCustomException("Exception in async method");
}
于 2015-07-31T11:19:08.130 回答
-5

我已将匿名委托包装在Task.Run(() =>.

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
     }

});
于 2013-09-06T22:31:10.430 回答