C# 中对 Task 中的异常进行捕获

以下是在 C# 中对 Task 中的异常进行捕获的几种常见方法:

方法一:使用 try-catch 语句

你可以使用 try-catch 语句来捕获 Task 中的异常,尤其是当你使用 await 关键字等待任务完成时。

using System;
using System.Threading.Tasks;class Program
{static async Task Main(){try{await Task.Run(() =>{// 模拟异常抛出throw new Exception("An error occurred in the task.");});}catch (Exception ex){Console.WriteLine($"Caught exception: {ex.Message}");}}
}

在上述代码中,使用 await 等待 Task.Run 中异步执行的代码。当 Task.Run 中的代码抛出异常时,异常会被 catch 块捕获并处理。

方法二:使用 ContinueWith 并处理 Task.Exception

对于不使用 await 的情况,可以使用 ContinueWith 方法来处理任务完成后的情况,包括异常。

using System;
using System.Threading.Tasks;class Program
{static void Main(){Task.Run(() =>{// 模拟异常抛出throw new Exception("An error occurred in the task.");}).ContinueWith(task =>{if (task.IsFaulted){// 处理异常foreach (var ex in task.Exception.InnerExceptions){Console.WriteLine($"Caught exception: {ex.Message}");}}});// 等待任务完成,这里只是为了防止程序提前退出,在实际应用中可能有不同的等待方式Console.ReadLine();}
}

在这个例子中,创建一个 Task 并使用 ContinueWith 来添加后续操作。如果任务发生故障(即抛出异常),task.IsFaulted 将为 true,并且可以通过 task.Exception.InnerExceptions 来访问异常信息。需要注意的是,Task.Exception 是一个 AggregateException,因为一个 Task 可能会抛出多个异常,所以它包含了一个内部异常列表。

方法三:使用 async-awaitTask.WhenAllTask.WhenAny 时的异常处理

当使用 Task.WhenAllTask.WhenAny 组合多个任务时,也可以使用 try-catch 来捕获异常。

using System;
using System.Threading.Tasks;class Program
{static async Task Main(){Task task1 = Task.Run(() =>{throw new Exception("Error in task 1");});Task task2 = Task.Run(() =>{// 正常执行});try{await Task.WhenAll(task1, task2);}catch (Exception ex){Console.WriteLine($"Caught exception: {ex.Message}");}}
}

在这个例子中,Task.WhenAll 会等待 task1task2 都完成。如果 task1 抛出异常,该异常将被 catch 块捕获。对于 Task.WhenAny,异常处理的逻辑类似,但它只会等待第一个任务完成,所以你可能需要额外的逻辑来确保在异常发生后处理其他任务。

方法四:使用 UnobservedTaskException 事件(不推荐)

在一些情况下,可以使用 TaskScheduler.UnobservedTaskException 事件来处理未观察到的异常,但这种方式在.NET 4.5 及以上版本中已经不推荐使用,因为异常可能会导致应用程序崩溃。

using System;
using System.Threading.Tasks;class Program
{static void Main(){TaskScheduler.UnobservedTaskException += (sender, e) =>{foreach (var ex in e.Exception.InnerExceptions){Console.WriteLine($"Unobserved exception: {ex.Message}");}// 标记为已观察,避免程序崩溃e.SetObserved();};Task.Run(() =>{throw new Exception("This is an unobserved exception.");});// 给任务一些时间抛出异常System.Threading.Thread.Sleep(1000);}
}

总结

  • 推荐使用 try-catchawait:对于使用 async-await 模式的异步编程,这是最简洁和直观的方式,能够直接捕获在任务执行过程中抛出的异常。
  • 使用 ContinueWith 进行链式处理:对于不使用 await 的情况,使用 ContinueWith 可以方便地在任务完成后检查是否发生故障并处理异常。
  • 处理多个任务的异常:使用 Task.WhenAllTask.WhenAny 时,仍然可以使用 try-catch 来捕获组合任务中可能出现的异常。

在实际开发中,选择合适的异常处理方法取决于你的具体代码结构和异步编程的使用方式。但总体而言,使用 try-catchawait 结合是最符合现代 C# 异步编程习惯和最安全的方式,能确保异常被妥善处理,避免程序因未处理的异常而崩溃。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE材质节点Fresnel

Fresnel节点 ExponentIn 控制边缘透明度 BaseReflectFractionIn 控制中心透明度

大数据学习(34)-mapreduce详解

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91…

浅谈云计算07 | 云安全机制

浅谈云计算安全机制:全方位守护云端世界 一、引言二、加密技术:数据的隐形护盾三、散列机制:数据完整性的忠诚卫士四、数字签名:数据来源与真伪的鉴定专家五、公钥基础设施(PKI):信任的基石六、…

docker-compose部署kafka 3.3.1 kraft

一、服务器: 节点1:10.1.1.165 节点2:10.1.1.164 节点3:10.1.1.169二、添加环境地址解析 vim /etc/hosts kafka1 10.1.1.165 kafka2 10.1.1.164 kafka3 10.1.1.169三、节点配置 节点1 version: "3" services:kafka1:image: bitnami/kafka:3.3.1contain…

Notepad++上NppFTP插件的安装和使用教程

一、NppFTP插件下载 图示是已经安装好了插件。 在搜索框里面搜NppFTP,一般情况下,自带的下载地址容易下载失败。这里准备了一个下载连接:Release v0.29.10 ashkulz/NppFTP GitHub 这里我下载的是x86版本 下载好后在nodepad的插件里面选择打…

Agile Scrum 敏捷开发方法

Agile Scrum 是一种敏捷开发方法,广泛用于软件开发以及其他项目管理领域。它强调迭代式的工作流程、团队协作、灵活应对变化和持续改进,旨在通过快速交付和反馈来最大化项目价值。Scrum 是 Agile(敏捷)方法中的一种具体实践框架&a…

高级运维:源码编译安装httpd 2.4,提供系统服务管理脚本并测试

1.下载httpd 2.4 源码 wget https://archive.apache.org/dist/httpd/httpd-2.4.54.tar.gz 2.解压下载压缩包 tar -zxvf httpd-2.4.54.tar.gz cd httpd-2.4.54 3.安装httpd需要的依赖包 sudo yum groupinstall "Development Tools" -y sudo yum install gcc glibc ap…

8.Bridge 桥接模式(结构型模式)

【1】抽象A>实现细节b 【2】抽象A>抽象B<实现细节b 【3】【抽象B】相对稳定&#xff0c;也可能变化 【实现细节b】频繁变化 【4】抽象B 不稳定&#xff1f; 思考问题&#xff1a;一个变化是平台&#xff08;抽象B&#xff09;的变化&#xff0c;另一个变化是型号…

STM32程序发生异常崩溃时,怎样从串口输出当时的程序调用栈等信息

当STM32程序发生异常崩溃时&#xff0c;为了从串口输出当时的程序调用栈信息&#xff0c;并使用Keil等工具确定具体的函数信息&#xff0c;你可以按照以下步骤操作&#xff1a; 启用调试信息输出&#xff1a; 在STM32程序中&#xff0c;你需要先确保启用了调试信息的输出。这通…

【PyQt】如何在mainwindow中添加菜单栏

[toc]如何在mainwindow中添加菜单栏 如何在mainwindow中添加菜单栏 主要有两种方法&#xff1a; 1.直接创建mainwindow进行添加 2.使用ui文件加载添加 第二种方法更为常见&#xff0c;可以应用到实际 1.直接创建mainwindow进行添加 import sysfrom PyQt5.QtWidgets import …

基于springboot+vue+微信小程序的宠物领养系统

基于springbootvue微信小程序的宠物领养系统 一、介绍 本项目利用SpringBoot、Vue和微信小程序技术&#xff0c;构建了一个宠物领养系统。 本系统的设计分为两个层面&#xff0c;分别为管理层面与用户层面&#xff0c;也就是管理者与用户&#xff0c;管理权限与用户权限是不…

【Rust】错误处理机制

目录 思维导图 引言 一、错误处理的重要性 1.1 软件中的错误普遍存在 1.2 编译时错误处理要求 二、错误的分类 2.1 可恢复错误&#xff08;Recoverable Errors&#xff09; 2.2 不可恢复错误&#xff08;Unrecoverable Errors&#xff09; 三、Rust 的错误处理机制 3…

Spring Boot教程之五十五:Spring Boot Kafka 消费者示例

Spring Boot Kafka 消费者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架&#xff0c;使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序&#xff0c;您可…

金融项目实战 04|JMeter实现自动化脚本接口测试及持续集成

目录 一、⾃动化测试理论 二、自动化脚本 1、添加断言 1️⃣注册、登录 2️⃣认证、充值、开户、投资 2、可重复执行&#xff1a;清除测试数据脚本按指定顺序执行 1️⃣如何可以做到可重复执⾏&#xff1f; 2️⃣清除测试数据&#xff1a;连接数据库setup线程组 ①明确…

linux下中文输入法ibus

在Linux系统中&#xff0c;现在都自带ibus框架&#xff0c;可以选择中文输入法&#xff0c;如果使用IBus输入法时无法输入中文&#xff0c;可以尝试以下几种方法来解决这个问题&#xff1a; 1. 检查环境变量 确保环境变量配置正确。可以在终端中运行以下命令来设置环境变量&a…

【Uniapp-Vue3】@import导入css样式及scss变量用法与static目录

一、import导入css样式 在项目文件中创建一个common文件夹&#xff0c;下面创建一个css文件夹&#xff0c;里面放上style.css文件&#xff0c;编写的是公共样式&#xff0c;我们现在要在App.vue中引入该样式。 在App.vue中引入该样式&#xff0c;这样就会使样式全局生效&#…

大疆机场及无人机上云

最近基于大疆上云api进行二次开发&#xff0c;后面将按照开发步骤对其进行说明&#xff01;

WINFORM - DevExpress -> gridcontrol---->主从模式

1.gridview设置 //不显示分组的面板gridView1.OptionsView.ShowGroupPanel = false;//自动改变行高适应内容 gridView1.OptionsView.RowAutoHeight = true;//允许自动合并单元格 gridView1.OptionsView.AllowCellMerge = true;//如果主从表中,没有找到从表内容也要显示(默认是…

Golang笔记——hashmap

本文详细介绍golang的哈希表的底层实现、扩容机制、插入查询过程以及并发安全性。 文章目录 定义Key无序性Key唯一性Key可比性 基本使用底层实现哈希表实现hmapbucket 数据结构bmap链地址法哈希冲突负载因子 扩容增量扩容等量扩容 查找过程插入过程删除流程非并发安全map 的线程…

【网络】:网络编程套接字

目录 源IP地址和目的IP地址 源MAC地址和目的MAC地址 源端口号和目的端口号 端口号 VS 进程ID TCP协议和UDP协议 网络字节序 字符串IP和整数IP相互转换 查看当前网络的状态 socket编程接口 socket常见API 创建套接字&#xff08;socket&#xff09; 绑定端口号&…