首页 / C# / C#中异步编程多个异常的处理方式
C#中异步编程多个异常的处理方式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#中异步编程多个异常的处理方式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2987字,纯文字阅读大概需要5分钟。
内容图文
![C#中异步编程多个异常的处理方式](/upload/InfoBanner/zyjiaocheng/1107/d8bc63213b134f3b86bca8bfef471c23.jpg)
异步编程异常处理
在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕捉异常,未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制。但是对于异步编程来说,异常处理一直是件麻烦的事情,所以接下来给大家介绍一下异步编程中的错误处理方式
单个异常的捕获
public static async Task ThrowExcrptionAsync(int ms, string message)
{
await Task.Delay(ms);
throw new Exception(message);
}
public static async Task Main(string[] args)
{
try
{
ThrowExcrptionAsync(2000, "first");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
如果调用以上的方法,并且没有等待,可以将异步方法放在try/catch中就可以捕获到异常,比如像上面一样调用ThrowExcrptionAsync方法,方法已经执行完毕,而throw new Exception(message)这句话还没执行,所以上面这段代码并不会捕获到异常
注意:返回void的异步方法不会等待,这是因为从async void方法抛出的异常无法捕获,因此,异步方法最好返回一个Task类型。处理程序方法或重写的基类方法不受此规则限制
异步方法异常的一个比较好的处理方式是使用await关键字,将其放在try/catch语句中,如以下代码琐事。异步调用ThrowExcrptionAsync方法后,主线程就会释放线程,但塔会在任务完成时保持任务的引用,此时(2s之后)会调用匹配的catch块内的代码
public static async Task Main(string[] args)
{
try
{
await ThrowExcrptionAsync(2000, "first");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
多个异常的捕获
此时如果调用两个异步方法,每个方法都会抛出异常,我们该如何处理呢?如以下代码
public static async Task Main(string[] args)
{
try
{
await ThrowExcrptionAsync(2000, "first");
await ThrowExcrptionAsync(1000, "second");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
第一个ThrowExcrptionAsync被调用,2s抛出异常信息(包含信息first),该方法结束后,另一个ThrowExcrptionAsync方法也被调用,1s之后抛出异常,事实并非如此,因为第一个ThrowExcrptionAsync已经抛出了异常,try块内的代码块并没有继续调用第二个ThrowExcrptionAsync方法。而是直接进入catch块内的第一个异常进行处理,但是在现实编程中,这个并非我们所想。我们需要两个方法不管异常,都需要执行,而不是某一个报错直接跳出,所以我们使用WhenAll方法等待所有方法执行完成再catch(在外部定义两个task对象,用来接受我们要执行方法的结果),
public static async Task Main(string[] args)
{
Task t1 = null;
Task t2 = null;
try
{
t1 = ThrowExcrptionAsync(2000, "first");
t2 = ThrowExcrptionAsync(1000, "second");
await Task.WhenAll(t1, t2);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
这个时候,我们已经让两个方法都执行了。没有管内部的错误,接下来我们去捕获两个异常中的错误信息,代码如下
public static async Task Main(string[] args)
{
Task t1 = null;
Task t2 = null;
try
{
t1 = ThrowExcrptionAsync(2000, "first");
t2 = ThrowExcrptionAsync(1000, "second");
await Task.WhenAll(t1, t2);
}
catch (Exception e)
{
if (t1.IsFaulted)
{
Console.WriteLine(t1.Exception.InnerException);
}
if (t2.IsFaulted)
{
Console.WriteLine(t2.Exception.InnerException);
}
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
在这里我们使用的的是IsFaulted属性,该属性用来检查任务的状态,以确定它们是否为出错状态,若出现异常,IsFaulted属性会返回true。可以使用Task类中的Exception.InnerException来访问信息本身。当然,我们知道IsFaulted的状态后。肯定是可以进行别的业务逻辑处理的。
另外还有一种比较快速获取task类中的异常信息的,代码如下:
public static async Task Main(string[] args)
{
Task taskResult = null;
try
{
var t1 = ThrowExcrptionAsync(2000, "first");
var t2 = ThrowExcrptionAsync(1000, "second");
await (taskResult = Task.WhenAll(t1, t2));
}
catch (Exception e)
{
Console.WriteLine(e.Message);
foreach (var item in taskResult.Exception.InnerExceptions)
{
Console.WriteLine(item.Message);
}
}
Console.ReadKey();
}
方法其实和上面的判断状态再去获取异常信息差不多,该方法主要是在日志中使用较多。
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
原文:https://www.cnblogs.com/ancold/p/11747755.html
内容总结
以上是互联网集市为您收集整理的C#中异步编程多个异常的处理方式全部内容,希望文章能够帮你解决C#中异步编程多个异常的处理方式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。