有没有人遇到过AggregateException.InnerExceptions.Count >1.

本文关键字:Count InnerExceptions AggregateException 没有人 遇到 | 更新日期: 2023-09-27 18:10:25

我在想,当AggregateException.InnerExceptions.Count> 1时,有人遇到过这种情况吗?

。, TPL包装异常,这是在任务体中提出的,在AggregateException。但是我从来没有见过有多个内部异常的情况。

如何通过TPL实现这一点?
如何使用任何 FCL(或其他广泛使用的库)类(示例将是有用的)来实现这一点?

我知道,有可能性构建这样的AggregateException实例,但问题是关于实践的。我问这个问题,是因为我想了解,如何处理AggregateException最好。

有没有人遇到过AggregateException.InnerExceptions.Count >1.

典型的情况是当一个任务依赖于多个任务时,其中不止一个任务抛出异常。例如:

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。