当调试器附加到.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()
?
答案 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
}
});