2

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

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);

我在我的 VS2012 设置中检查了“CLR 异常”:“用户未处理时中断”选项并运行此代码提供了 VS 的“用户代码未处理 NRE 异常”弹出窗口throw null;

我试图在 ContinueWith 和稍后的 Wait 上尝试捕获异常,但仍然得到未处理的异常。

我觉得打开“CLR exceptions”的解决方案:“break on user-unhandled” off 似乎是错误的,因为我实际上处理了这个异常。那么管理它的正确方法是什么?

4

1 回答 1

3

调试器停止执行的原因是“中断用户未处理的异常”将中断任何未由用户代码(“我的代码”)中的处理程序处理的异常。

由于捕获异常的 TPL不被视为用户代码,因此调试器将考虑用户代码未处理的异常。

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

希望异常不是您正常流程的一部分。如果不是这样,那么在调试器中将异常视为未处理实际上可能对调试任务流中的错误是一件好事。

于 2013-02-03T08:20:13.467 回答