C# 异步方法的异常处理

本文探讨了如何正确处理异步方法中的错误,包括使用try/catch、await关键字,以及避免在void方法中抛出异常。通过实例解析了处理async/await代码异常的最佳做法,适合开发者提升异步编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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}");
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值