Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当AggregateException.InnerExceptions.Count>;1._C#_.net_Exception Handling - Fatal编程技术网

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中遇到多个异常。