【发布时间】: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