C# AggreateException

在 C# 中,AggregateException 是一种特殊类型的异常,它允许在多个异步任务中捕获并组合多个异常。当在一个异步任务中同时执行多个子任务时,如果其中任何一个子任务抛出了异常,那么父任务将会收到 AggregateException 异常,它包含一个或多个内部异常,每个内部异常代表一个子任务抛出的异常。

在实际编程中,AggregateException 常常用于处理并发编程中的多个异步任务中的异常。举个例子,假设我们需要同时从多个网站上爬取数据,我们可以将每个网站的爬取任务封装成一个异步方法,再使用 Task.WhenAll 方法来等待所有任务完成。如果有一个或多个任务抛出异常,那么 Task.WhenAll 方法将会抛出 AggregateException 异常。

下面是一个简单的示例,演示了如何使用 AggregateException 来处理多个任务中的异常:

Task taskResult = null;
var tasks = new Task[] {
            Task.Run(() => { throw new Exception("Task 1 failed"); }),
            Task.Run(() => { throw new Exception("Task 2 failed"); }),
            Task.Run(() => { throw new Exception("Task 3 failed"); })
        };

try
{
    await (taskResult= Task.WhenAll(tasks));
}
catch (Exception e)
{
    if(e is AggregateException ex)
    {
        Console.WriteLine($"Caught {ex.InnerExceptions.Count} exceptions:");
        foreach (var innerEx in ex.InnerExceptions)
        {
            Console.WriteLine(innerEx.Message);
        }
    }
    else
    {
        foreach(var exx in taskResult.Exception.InnerExceptions)
        {
            Console.WriteLine($"inner exception {exx.Message}");
        }
        Console.WriteLine(e.Message);
    }
    
}
Console.WriteLine();



在上面的示例中,我们创建了三个异步任务,每个任务都会抛出一个异常。然后我们使用 Task.WhenAll 方法等待所有任务完成,并在 try-catch 块中捕获 AggregateException 异常。如果有任何一个任务抛出异常,那么 AggregateException 异常将包含所有子异常,我们可以使用 InnerExceptions 属性来访问它们。

output:

inner exception Task 1 failed
inner exception Task 2 failed
inner exception Task 3 failed
Task 1 failed
posted @ 2023-05-01 10:01  JohnYang819  阅读(432)  评论(0编辑  收藏  举报