我想用ContinueWith()
来包装可以由异步任务抛出的异常。如果我只是从继续操作中抛出东西似乎可行,但我的调试器声称这个异常是未处理的。我做错了什么或者这是一个Visual Studio问题?有没有更简单的方法来做到这一点,还是一种解决我的调试器问题的方法,以停止最终处理的异常?从ContinueWith抛出异常
下面的测试通过并打印出“捕获的包装异常如预期”,但是当我调试它时,throw new CustomException
行显示为“未被用户代码处理”。
var task = DoWorkAsync().ContinueWith(t => {
throw new CustomException("Wrapped", t.Exception.InnerException); // Debugger reports this unhandled
}, TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously);
try {
task.Wait();
Assert.Fail("Expected work to fail");
} catch (AggregateException ag) {
if (!(ag.InnerException is CustomException))
throw;
}
Console.WriteLine("Caught wrapped exception as expected");
这里的关键,是你要访问Exception属性(或者通过访问任务。结果财产(一AggregateException中的异常重新抛出,如果你有一个任务)... –
2012-07-26 21:35:07
DoWorkAsync()可以抛出一堆不同的异常,我只是试图将它们翻译成几个更高级别的“CustomException”,在调用代码中处理起来会比较麻烦,但实际上我不知道现在完全处理东西 所以我正在寻求将失败的任务转换成另一个失败的任务其中ex的类型ception是不同的。 –
jtb
2012-07-26 21:38:29
如果抛出一个CustomException,TPL子系统将把它包装在相同类型的AggregateException中,该类型将包装从DoWorkAsync抛出的异常。 – 2012-07-26 21:40:54