Jon*_*han 5 c# asynchronous exception visual-studio
我想运行几个任务,其中一些任务将异步完成,然后等待所有任务完成。由于任务可能会引发异常,因此我想捕获并记录它们。该示例代码:
static async Task doit(int x)
{
try
{
Console.WriteLine("{0} {1} start", x, Thread.CurrentThread.ManagedThreadId);
await Task.Run(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(2 + x)); // simulate long-running stuff worth awaiting...
if (x == 3)
{
throw new Exception("Exception inside task " + x.ToString()); // Simulate the async task throwing exception
}
});
if (x == 2)
{
throw new Exception("Exception after task " + x.ToString()); // Simulate post-async task throwing exception
}
Console.WriteLine("{0} {1} end", x, Thread.CurrentThread.ManagedThreadId);
}
catch (Exception ex)
{
Console.WriteLine("{0} {1} Exception: {2}", x, Thread.CurrentThread.ManagedThreadId, ex.Message);
}
}
private static void TestTasks()
{
var tasks = Enumerable.Range(1, 3).Select(n => doit(n)).ToArray();
Console.WriteLine("Waiting");
Task.WaitAll(tasks);
Console.WriteLine("all end");
}
Run Code Online (Sandbox Code Playgroud)
如果我从控制台运行此代码,则它的输出如下所示:
1 1 start
2 1 start
3 1 start
Waiting
1 3 end
2 4 Exception: Exception after task 2
3 5 Exception: Exception inside task 3
all end
Run Code Online (Sandbox Code Playgroud)
但是,如果我在Visual Studio中调试,调试器将在指出的异常处停止Exception was unhandled by user code。然后,我需要点击F5 Continue以完成代码。
我注意到,如果禁用Options => Debugger => Enable Just My Code,则调试器不会停止。但是,我不想永久设置此设置,因为我使用的某些框架可以处理我确实希望调试器停止的异常。
为什么即使异常在 try/catch 中,调试器也会停止?
技术上,代码抛出不是由任何捕获的异常您的当前调用堆栈上的代码。它被(编译器生成的)async状态机捕获并放置在返回的任务上。后来,当从返回的任务Task.Run是await编,即例外是再抛出。
我怎样才能让调试器不停止在这个异常处?
现在,您唯一的选择是让调试器以某种方式忽略此异常(仅禁用我的代码,禁用中断该类型的用户未处理的异常,...)。
如果您认为 VS 应该在这里提供更好的用户体验,请随时打开用户意见建议。
| 归档时间: |
|
| 查看次数: |
549 次 |
| 最近记录: |