当调试器附加到.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条答案
按热度按时间uqcuzwp81#
在
Debug
菜单下,选择Exceptions...
。在“例外”对话框中,选中Common Language Runtime Exceptions
行旁边的Thrown
框。对于VS2022…选择“Debug”“Windows”“Exceptions Settings”,然后选中
Common Language Runtime Exceptions
左侧的复选框。8wigbo562#
我想知道是否有人知道如何解决这个问题?也许是最新的Visual Studio中的一个设置...?
一个讨厌但可行的解决方案(在我的情况下)是抛出我自己的 custom Exception,然后修改Stephen Cleary的答案:
更具体地说,将您的 custom Exception添加到列表中,然后勾选其“抛出”框。
例如:
cotxawn73#
我已经将匿名委托 Package 在
Task.Run(() =>
中的try/catch中。