10

我正在尝试使用ContinueWith(). 如果我只是从继续操作中抛出,事情似乎可以工作,但我的调试器声称异常未处理。我做错了什么还是这是 Visual Studio 的问题?有没有更干净的方法来做到这一点,或者有一种方法可以解决我的调试器停止最终处理的异常的问题?

下面的测试通过并打印“按预期捕获包装异常”,但是当我调试它时,该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");
4

2 回答 2

12

启用“仅我的代码”后,Visual Studio 在某些情况下会在引发异常的行中断并显示一条错误消息,指出“用户代码未处理异常”。这个错误是良性的。您可以按 F5 继续并查看这些示例中演示的异常处理行为。为防止 Visual Studio 在出现第一个错误时中断,只需取消选中“工具”、“选项”、“调试”、“常规”下的“仅我的代码”复选框。

来自http://msdn.microsoft.com/en-us/library/dd997415.aspx

于 2012-12-19T22:17:12.290 回答
7

您似乎没有用延续来“包装”异常,您似乎是在延续中抛出异常。如果 DoWorkAsync 可以引发异常,我将继续“包装”它,如下所示:

DoWorkAsync().ContinueWith(t=>{
 Console.WriteLine("Error occurred: " + t.Exception);
}, TaskContinuationOptions.OnlyOnFaulted);

或者,如果你想在异步方法之外“处理”异常,你可以这样做:

var task = DoWorkAsync();

task.Wait();
if(task.Exception != null)
{
  Console.WriteLine("Error occurred: " + task.Exception);
}

如果要转换抛出的异常,可以执行以下操作:

var task = DoWorkAsync().ContinueWith(t=>{
 if(t.Exception.InnerExceptions[0].GetType() == typeof(TimeoutException))
 {
     throw new BackoffException(t.Exception.InnerExceptions[0]);
 }
}, TaskContinuationOptions.OnlyOnFaulted);

你可以这样处理BackoffException

if(task.IsFaulted)
{
   Console.WriteLine(task.Exception.InnerExceptions[0]);
   // TODO: check what type and do something other than WriteLine.
}
于 2012-07-26T21:33:19.673 回答