【发布时间】:2013-10-09 08:05:28
【问题描述】:
我正在尝试抛出并捕获 AggregateException。 我在 C# 上并没有非常多地使用异常,但我发现的行为有点令人惊讶。
我的代码是:
var numbers = Enumerable.Range(0, 20);
try
{
var parallelResult = numbers.AsParallel()
.Where(i => IsEven(i));
parallelResult.ForAll(e => Console.WriteLine(e));
}
catch (AggregateException e)
{
Console.WriteLine("There was {0} exceptions", e.InnerExceptions.Count());
}
它正在调用函数 IsEven
private static bool IsEven(int i)
{
if (i % 10 == 0)
throw new AggregateException("i");
return i % 2 == 0;
}
这会引发 AggregateException。
我希望代码写入 0,20 范围内的每个偶数,并且两次“有 1 个异常”。
我得到的是打印了一些数字(它们是 ForAll 的随机原因),然后抛出异常,但没有被捕获并且程序停止。
我错过了什么吗?
【问题讨论】:
-
不知道为什么会这样,尝试将
throw new AggregateException("i");更改为throw new ArgumentException("i");会产生预期的结果 -
您通过抛出错误的异常来混淆系统。改为抛出 Argument 或 InvalidOperationException。
-
@SriramSakthivel - 为什么您的版本会导致应用程序崩溃 - 我必须推测,但它的 InnerExceptions 将为空。出乎意料。
-
@SriramSakthivel - 但内部代码不应抛出聚合。不是他们的工作。
-
@HenkHolterman 当然,我知道这是一个坏主意,AggregateException 的目的是结合许多异常并保留 StackTrace。但我找不到任何说明我们不应该这样做的文档