Async/Await块中未捕捉到异常

本文关键字:异常 Await Async | 更新日期: 2023-09-27 18:00:06

我只是在学习在windows窗体应用程序中使用async/await,试图在执行缓慢操作的同时保持windows应用程序的响应。我发现在处理抛出的异常方面有所不同。

如果我使用WebClient.DownloadStringTaskAsync,异常会被我的代码捕获:

private async void button1_Click(object sender, EventArgs e)
{
  try
  {
    this.textBox1.Text = await webClient.DownloadStringTaskAsync("invalid address");
  }
  catch (Exception exc)
  {
    textBox1.Text = exc.Message;
  }
}

然而,如果我在自己的代码中调用异步函数,则不会捕获异常:

private string GetText()
{
  throw new Exception("Tough luck!");
}
private async void button3_Click(object sender, EventArgs e)
{
  using (var webClient = new WebClient())
  {
    try
    {
      this.textBox1.Text = await Task.Run(() => GetText());
    }
    catch (Exception exc)
    {
      textBox1.Text = exc.Message;
    }
  }
}

作为stackerflow问题的答案,使用async/await抛出和捕获异常的正确方法建议有人在工具->选项->调试->常规"

在Daniel Hilgarth(谢谢Daniel!)的评论之后,我看到了一个复制粘贴错误。我在这里纠正了它。问题仍然存在,但如果您按照建议禁用"仅我的代码",则会正确捕获异常。

所以我想问题已经解决了。

Async/Await块中未捕捉到异常

问题是:
您正在投掷Exception,但正在接住WebException

两种解决方案:

  1. 投掷WebException
  2. 捕获Exception

解决方案1是首选方案,因为您实际上不应该抛出不特定的Exception

您抛出了一个类型Exception,但只捕获了更具体的WebException。捕获WebException将只捕获WebException类型或从其派生的类型的异常。