【问题标题】:Why does the wrapping exception disappear为什么包装异常消失
【发布时间】:2018-02-27 14:39:09
【问题描述】:

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

为什么会这样?

[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 { }

【问题讨论】:

  • CustomException 是否继承自 AggregateException
  • @ScottHannen 不,感谢您的提问。我忘了包括它的定义。现在刚刚添加。
  • 您不应该捕获 CustomException 吗?在包裹和投掷之前?
  • @FilipMilovanović 我不知道您所说的“应该”是什么意思。这段代码是一个 MWE,它表达了我不理解的 C# 的一些行为。
  • @TysonWilliams:我的意思是,(除非我弄错了),“throw new WrappingException(task.Exception)”行将永远不会执行,因为您未处理的 CustomException 将被包装在 AggregateException并传播给调用者(单元测试),调用者可能会对其进行解包,将其检测为 CustomException,然后终止。所以你的 throw 语句永远不会执行 - 我认为你需要一个 try-catch 块。

标签: c# asynchronous exception-handling


【解决方案1】:

那是因为这条线

throw new WrappingException(task.Exception) 

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多