C# AggreateException

发布时间 2023-05-01 10:09:19作者: JohnYang819

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

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

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

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        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 Task.WhenAll(tasks);
        }
        catch (AggregateException ex) {
            Console.WriteLine($"Caught {ex.InnerExceptions.Count} exceptions:");
            foreach (var innerEx in ex.InnerExceptions) {
                Console.WriteLine(innerEx.Message);
            }
        }
    }
}


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