C# 异步方法的异常处理

431982bc167826ee010b5e10521b55da.png

在使用异步方法时,应该知道错误的一些特殊处理方式。所有 ErrorHandling 示例的代码都使用了如下名称空间:

System

System.Threading.Tasks

从一个简单的方法开始,它在延迟后抛出一个异常:

static async Task ThrowAfter(int ms, string message) 
{await Task.Delay(ms);throw new Exception(message);
}

如果调用异步方法,并且没有等待,可以将异步方法放在 try/catch 块中,就会捕获不到异常。这是因为 DontHandle 方法在 ThrowAfter 抛出异常之前,已经执行完毕。需要等待 ThrowAfter 方法,如下一节的示例所示。注意这个代码片段不会抛出异常:

private static void DontHandle()
{try{ThrowAfter(200, "first");// exception is not caught because this method is finished// before the exception is thrown}catch (Exception ex){Console.WriteLine(ex.Message);}
}

警告

返回 void 的异步方法不会等待。这是因为从 async void 方法抛出的异常无法捕获。因此,异步方法最好返回一个 Task 类型。处理程序方法或重写的基类方法不受此规则限制。

异步方法异常的一个较好处理方式是使用 await 关键字,将其放在 try/catch 语句中,如以下代码块所示。异步调用 ThrowAfter 方法后,HandleOneError 方法就会释放线程,但它会在任务完成时保持任务的引用。此时(2s 后,抛出异常),会调用匹配的catch 块内的代码:

private static async void HandleOneError()
{try{await ThrowAfter(2000, "first");}catch (Exception ex){Console.WriteLine($"handled {ex.Message}");}
}

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

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

相关文章

Mark Down 使用实例

为什么80%的码农都做不了架构师?>>> Mark Down 使用实例 MarkDown是一个非常轻量级的 【标记语言】,有点有很多,书写比较快速,学习成本低,统一的排版模式,可导出 PDF HTML 等文档格式&#xff…

JoySSL付费版证书的优势

JoySSL付费版证书相比免费版有很多优势。首先,付费版证书通常由权威的CA(证书颁发机构)签发,在浏览器和操作系统中具有99.99%的兼容性,被主流浏览器如Chrome、Firefox、Safari和Edge等广泛支持和认可。这确保了无论用户…

Git命令集十三——快照操作

2019独角兽企业重金招聘Python工程师标准>>> Git命令集十三——快照操作 Git工具中提供了一个stash命令,这个命令的作用是创建快照。快照主要的用途是将当前未更新到缓存区的修改进行入栈保存,创建快照后,Git的状态会变回上一次提…

Asp.net core IdentityServer4与传统基于角色的权限系统的集成

img写在前面因为最近在忙别的,好久没水文了 今天来水一篇;在学习或者做权限系统技术选型的过程中,经常有朋友有这样的疑问 :“IdentityServer4的能不能做到与传统基于角色的权限系统集成呢?”“我的公司有几百个接口&a…

算法小白——基本排序算法入门

计算的 时间复杂度(最差、平均、和最好性能),依据列表(list)的大小(n)。一般而言,好的性能是O(n log n),且坏的性能是O(n^2)。对于一个排序理想的性能是O(n)。仅使用一个抽象关键比较运算的排序…

使用Dynamic LINQ创建高级查询服务

前言在以前的文章中,我们介绍了使用AutoFilterer.Generators创建高级查询服务。但是,AutoFilterer.Generators只能提供简单的范围筛选:今天,我们介绍如何使用Dynamic LINQ轻松实现更强大的高级查询服务。Demo创建ASP.NET Core Web…

线程池的开源实现(mariadb和percona版本)

2019独角兽企业重金招聘Python工程师标准>>> 一、"Thread pool in MariaDB 5.5" 线程池解决的问题: 传统mysql使用一个线程处理一个客户端连接,如果许多的并发用户,将使性能下降。因为大量的线程将引起上下文交换&#…

C++之goto

1 goto code: result:

ABP vNext微服务架构详细教程——结束语

ABP vNext微服务架构详细教程——简介ABP vNext微服务架构详细教程——架构介绍ABP vNext微服务架构详细教程——身份管理服务ABP vNext微服务架构详细教程——基础服务层ABP vNext微服务架构详细教程——聚合服务ABP vNext微服务架构详细教程——身份认证服务ABP vNext微服务架…

创建 linux分区命令,Linux中创建分区

在很多情况下我们可能需要在使用Linux的时候创建新的分区来帮助我们更好的学习和工作,接下来我就详细的介绍一下如何利用fdisk这条命令进行硬盘分区。Linux磁盘分区和windows存在区别,Linux分区分为三类 主分区 扩展分区 和逻辑分区。然而它们三个关系有…

Android studio之Error:(23, 17) Failed to resolve: junit:junit:4.12

1 probleam 2 resolve method // testCompile junit:junit:4.12

20杨氏矩阵查找

问题描述:在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 例如下面的二维数组就…

玩一玩微信公众号开发(一) 接入系统

一开始我准备学一学微信开发。后来看了一下文档,需要自己搭服务器进行接口对调。有点麻烦所以就没继续学下去。现在学习过了Kotlin、Spring Boot很多东西,感觉可以比较方便的进行开发了。今天就来回过头学习一下。 准备工作 申请公众号 首先说明一下&…

Android studio之NDK integration is deprecated in the current plugin解决办法

1 、问题 编译Android项目,出现下面错误 NDK integration is deprecated in the current plugin 2、解决办法 在我们 gradle.properties(Project Properties) file add android.useDeprecatedNdktrue

使用 System.Net.Http.Json 简化 HttpClient 的使用

使用 System.Net.Http.Json 简化 HttpClient 的使用Intro从 .NET Core 3.1 开始,微软添加了一个 System.Net.Http.Json 的扩展,可以用来简化 HttpClient 的使用,看到在很多项目里还并未开始使用,所以想向大家介绍一下SamplePostAs…

MySQL的四种不同查询的分析

1.前置条件:本次是基于小数据量,且数据块在一个页中的最理想情况进行分析,可能无具体的实际意义,但是可以借鉴到各种复杂条件下,因为原理是相同的,知小见大,见微知著!打开语句分析并确认是否已经…

.NET6之MiniAPI(十八):OpenAPI swagger

从本篇开始,介绍一些很不错的三方库,来丰富MiniAPI的使用。在创建MiniAPI项目时,模板提供了一个是否启用OpenAPI的选项,足见这个三方库的优势和强大。OpenAPI为我们测试API提供了强大的支持,调用API的开发人员&#xf…

Android之ndk-build出现c:28:51: error: ‘get_string‘ undeclared here (not in a function)解决办法

1 problem ndk-build error: get_string undeclared here (not in a function) 2 resolve jstring get_strstring(JNIEnv* env, jobject thiz) {return (*env)->NewStringUTF(env, "I am chenyu, 动态注册JNI"); }jint add_int(JNIEnv* env, jobject jobj, ji…

BeetleX服务网关授权配置

很多应用服务都需要授权访问,为了更好地统一处理这种授权验证,服务网关提供了JWT验证插件用于解决这问题。网关的JWT验证插件默认是关闭的,只有当开启后网关才会对请求进行拦截验证处理。开启开启JWT验证需要在插件管理里开启Webapi JWT验证插…

Linux下的压缩与解压缩

tar命令zip命令unzip命令gzip命令bzip2命令tar命令:压缩和解压缩tar格式的文件格式:tar [主选项辅选项] 文件或目录【主选项告诉tar要做什么事,是必须要有的,辅选项是辅助使用的,和通常的选项一样,可选】主…