在显示OnlyOnFaulted时使用TPL时出现未处理的异常

时间:2013-02-03 07:57:40

标签: c# exception-handling task-parallel-library unobserved-exception

这是来自“Nutshell中的C#5.0”的示例代码

TaskCreationOptions atp = TaskCreationOptions.AttachedToParent;
Task.Factory.StartNew (() =>
{
    Task.Factory.StartNew (() => { throw null; }, atp);
    Task.Factory.StartNew (() => { throw null; }, atp);
    Task.Factory.StartNew (() => { throw null; }, atp);
})
.ContinueWith (p => Console.WriteLine (p.Exception),
                TaskContinuationOptions.OnlyOnFaulted);

我有一个“CLR例外”:在我的VS2012设置中选中“中断用户未处理”选项并运行此代码,在throw null;上提供了VS的“NRE异常未被用户代码处理”弹出窗口

我尝试在ContinueWith中等待尝试捕获异常,但后来仍然遇到未处理的异常。

我觉得这是一个解决方案,转而使用“CLR例外”:“打破用户未处理”关闭似乎是错误的,因为我实际上处理了这个异常。那么管理它的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

调试器停止执行的原因是“中断用户未处理的异常”break on any exception that is not handled by a handler in user code ("My Code").

由于TPL(即捕获异常的那个)是not considered user code,调试器会认为用户代码未处理异常。

问题是,TPL没有任何其他方法来触发TaskContinuationOptions.OnlyOnFaulted,所以我担心你可能会看到异常。

希望获得异常不是正常流程的一部分。如果不是这样,在调试器中看到未处理的异常对于调试任务流中的错误实际上是一件好事。