在使用异步方法时,应该知道错误的一些特殊处理方式。所有 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}");
}
}
软谋的.NET全套架构视频,大多视频包含源码,录制时间(初中级是2019~2020高级架构是2020~2021),原价6499,现仅需299元。这个活动周三推出后,受到热捧,仅一个技术群就几十人抢购!最后几天活动,目录和介绍:点击下方超链接查看 需要的加微zls20210502,进技术群的加微mm1552923,备注进群 |
往期推荐
· C# 数据流
· C# 类型系统
· C# 连接数据库
· C# 迭代器
Love life,love yourself
关注小编不迷路呦~