为什么包装异常会消失

时间:2018-02-27 14:39:09

标签: c# asynchronous exception-handling

我不理解以下测试的行为(使用xUnit.net用C#编写)。我认为ThrowsWrappingException会通过而ThrowsCustomException会失败。相反,它们具有相反的行为:ThrowsWrappingExceptionThrowsCustomException通过时失败。

为什么?

[Fact]
public async Task ThrowsWrappingException() =>
  await Assert.ThrowsAsync<WrappingException>(InterceptException);

[Fact]
public async Task ThrowsCustomException() =>
  await Assert.ThrowsAsync<CustomException>(InterceptException);

private async Task InterceptException() {
  var task = ThrowCustomException();
  await Task.WhenAll(task);
  throw new WrappingException(task.Exception);
}

private Task ThrowCustomException() =>
  throw new CustomException();

private class WrappingException : Exception {
  public WrappingException(Exception e)
    : base(e.Message, e) { }
}

private class CustomException : Exception { }

1 个答案:

答案 0 :(得分:1)

这是因为行

throw new WrappingException(task.Exception) 

永远不会执行,因为未处理的CustomException将被包装在AggregateException中并传播给调用者(单元测试),我猜,它将解压缩并检测到它是一个CustomException,然后终止。

所以throw语句永远不会执行;你可以添加一个try-catch块来改变它。