C# 当AggregateException.InnerExceptions.Count>;1.
我想知道,当C# 当AggregateException.InnerExceptions.Count>;1.,c#,.net,exception-handling,C#,.net,Exception Handling,我想知道,当aggregateeexception.InnerExceptions.Count>1时,有人遇到过这样的情况吗 例如,TPL包装异常,该异常是在任务体的AggregateException中提出的。但我从未见过这样的情况,当有不止一个内在的例外时 如何通过第三方物流实现这一目标? 如何使用任何FCL(或其他广泛使用的库)类实现这一点(示例将非常有用) 我知道,有可能构建这样的aggregateeexception实例,但问题是关于一种实践。我之所以问这个问题,是因为我想了解,处理a
aggregateeexception.InnerExceptions.Count
>1时,有人遇到过这样的情况吗
例如,TPL包装异常,该异常是在任务体的AggregateException
中提出的。但我从未见过这样的情况,当有不止一个内在的例外时
如何通过第三方物流实现这一目标?如何使用任何FCL(或其他广泛使用的库)类实现这一点(示例将非常有用)
我知道,有可能构建这样的
aggregateeexception
实例,但问题是关于一种实践。我之所以问这个问题,是因为我想了解,处理aggregateeexception
的最佳方法是什么。典型的情况是,一个任务依赖于多个任务,并且其中多个任务抛出异常。例如:
var t1 = Task.Factory.StartNew( () => { throw new Exception(); } );
var t2 = Task.Factory.StartNew( () => Console.WriteLine("Innocuous") );
var t3 = Task.Factory.StartNew( () => { throw new Exception(); } );
// Output: 2
var t4 = Task.WhenAll(t1, t2, t3)
.ContinueWith(t => Console.WriteLine(t.Exception.InnerExceptions.Count),
TaskContinuationOptions.OnlyOnFaulted);
正如Ani所说,这些
聚合异常可以通过多个连续的任务
来创建,使用continuations来观察异常
Task t1 = Task.Factory.StartNew(() => { throw new Exception(); });
Task t2 = Task.Factory.StartNew(() => { throw new Exception(); });
Task t3 = Task.WhenAll(t1, t2)
.ContinueWith(t => t.Exception.InnerExceptions.Count(),
TaskContinuationOptions.OnlyOnFaulted);
通常,您会在一个continuation中处理aggregateeexception
。continuation可以发现antecedent任务的exception属性是否引发了异常。下面将NullReferenceException
的结果打印到控制台
Task task1 = Task.Factory.StartNew (() => { throw null; });
Task task2 = task1.ContinueWith (ant => Console.Write(ant.Exception());
如果task1
引发异常,而该异常未被continuation捕获/查询,则该异常将被视为未处理,应用程序将死亡。对于continuations,通过Status
关键字建立任务结果就足够了
asyncTask.ContinueWith(task =>
{
// Check task status.
switch (task.Status)
{
// Handle any exceptions to prevent UnobservedTaskException.
case TaskStatus.RanToCompletion:
if (asyncTask.Result)
{
// Do stuff...
}
break;
case TaskStatus.Faulted:
if (task.Exception != null)
mainForm.progressRightLabelText = task.Exception.Flatten().Message;
else
mainForm.progressRightLabelText = "Operation failed!";
default:
break;
}
}
在上述情况下,我只希望出现一个异常,以确保我可以调用这种情况。如果需要其他类型的异常,可以根据需要迭代InnerException
s
我希望这能有所帮助。举个例子:如果您有一个父任务,它创建了一个或多个子任务(设置为“附加到父任务”),那么子任务和父任务可能会引发异常,在这种情况下,您将在从父任务返回的AggregateException中遇到多个异常。