有没有人遇到过AggregateException.InnerExceptions.Count >1.
本文关键字:Count InnerExceptions AggregateException 没有人 遇到 | 更新日期: 2023-09-27 18:10:25
我在想,当AggregateException.InnerExceptions.Count
> 1时,有人遇到过这种情况吗?
。, TPL包装异常,这是在任务体中提出的,在AggregateException
。但是我从来没有见过有多个内部异常的情况。
如何通过TPL实现这一点?
如何使用任何 FCL(或其他广泛使用的库)类(示例将是有用的)来实现这一点?
我知道,有可能性构建这样的AggregateException
实例,但问题是关于实践的。我问这个问题,是因为我想了解,如何处理AggregateException
最好。
典型的情况是当一个任务依赖于多个任务时,其中不止一个任务抛出异常。例如:
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所说,这些AggregateExceptions
可以通过使用延续来观察异常的多个连续Task
来创建。
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中处理AggregateException
。延续可以通过前置任务的exception属性发现是否由前置Task
抛出异常。下面的代码将NullReferenceException
的结果打印到控制台
Task task1 = Task.Factory.StartNew (() => { throw null; });
Task task2 = task1.ContinueWith (ant => Console.Write(ant.Exception());
如果task1
抛出异常,并且该异常没有被continuation捕获/查询,则认为未处理并且应用程序死亡。对于延续,通过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;
}
}
在上面我只期望一个异常-确保这种情况下,我可以调用Flatten()
。如果您期待其他类型的异常,您可以根据需要迭代InnerException
s。