在 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

C# AggreateException的更多相关文章

  1. Serilog 源码解析——Sink 的实现

    在上一篇中,我们简单地查看了 Serilog 的整体需求和大体结构.从这一篇开始,本文开始涉及 Serilog 内的相关实现,着重解决第一个问题,即 Serilog 向哪里写入日志数据的.(系列目录) ...

随机推荐

  1. 面试题10- II. 青蛙跳台阶问题

    地址:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/ <?php /** 一只青蛙一次可以跳上1级台阶,也可 ...

  2. vivo 大规模容器集群运维平台实践

    作者:来自 vivo 互联网服务器团队- Zhou Qi .Kong Manyu 容器平台已经成为支持应用运维和部署的重要基础设施,当前 vivo 内部容器平台共有20+生产集群,管理数万物理机节点, ...

  3. 【插件介绍】Mesh2Geom插件

    Mesh to Geometry Plugin,来自达索官方论坛社区 原帖链接:Mesh to Geometry Plugin plugin feature: 允许Abaqus 用户从网格文件生成几何 ...

  4. 基于webman实现的服务层框架-webman-biz-framework

    简介 webman的基础上扩展的一个服务层框架,基于分层体系结构的代码模式. 如果觉得有用,可以帮我在webman-biz-framework点个小星星哟,也希望大家交流 分层体系结构的代码模式 什么 ...

  5. 前缀函数和 KMP "跳步骤"模式匹配

    在一篇由字符构成的长文中查找另一个短字符串出现的位置,这可以算是编程领域最最常见的问题(比如按下 Ctrl + F 就可以打开你浏览器的查找功能).这个问题叫做字符串的模式匹配,我们把被查找的关键词叫 ...

  6. Golang 入门 : 常量

    常量 相对于变量而言,常量是在程序使用过程中,不会改变的数据.有些地方你需要将定义好的常量重复使用,代码中你不允许它的值改变.例如 圆周率 在程序执行过程中不会改变. 常量的声明 const Pi f ...

  7. jquery简单的上传图片预览

    html <div id="bcd"></div> <input type="file" id="abc"&g ...

  8. 【抓包】Fidder Script自动修改包

    Fiddler Script的本质是用JScript.NET编写的一个脚本文件CustomRules.js 但是它的语法很像C#但又有些不一样,比如不能使用@符号 通过修改CustomRules.js ...

  9. linux防火墙查看状态firewall

    一.firewall防火墙 1.查看firewall服务状态 systemctl status firewalld 出现Active: active (running)切高亮显示则表示是启动状态. 出 ...

  10. 解决VuePress中的”Error from chokidar : Error: EBUSY“问题

    .title { padding: 10px; background-color: rgba(3, 169, 244, 1); font-size: 16px; color: rgba(255, 25 ...