gpt4 book ai didi

c# - 捕获 AggregateException

转载 作者:IT王子 更新时间:2023-10-29 04:19:18 25 4
gpt4 key购买 nike

我正在尝试抛出并捕获 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 的随机原因),然后抛出异常,但没有被捕获,程序停止。

我错过了什么吗?

最佳答案

这其实有点意思。我认为问题在于您正在以一种意想不到的方式使用 AggregateException,这会导致 PLINQ 代码内部出现错误。

AggregateException 的全部要点是将并行过程中可能同时(或几乎同时)发生的多个异常组合在一起。因此 AggregateException 应该至少有一个内部异常。但是您正在抛出 new AggregateException("i"),它没有内部异常。 PLINQ 代码尝试检查 InnerExceptions 属性,遇到某种错误(可能是 NullPointerException),然后似乎进入某种循环。这可以说是 PLINQ 中的一个错误,因为您正在为 AggregateException 使用一个有效的构造函数,即使它是一个不寻常的构造函数也是如此。

正如别处所指出的,抛出 ArgumentException 在语义上更正确。但是您可以通过抛出一个正确构造的 AggregateException 来获得您正在寻找的行为,例如通过将 IsEven 函数更改为如下所示:

private static bool IsEven(int i)
{
if (i % 10 == 0){
//This is still weird
//You shouldn't do this. Just throw the ArgumentException.
throw new AggregateException(new ArgumentException("I hate multiples of 10"));
}
return i % 2 == 0;
}

我认为这个故事的寓意是不要抛出 AggregateException 除非你真的知道你在做什么,特别是如果你已经在并行或 Task 基于某种操作。

关于c# - 捕获 AggregateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19266338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com