簡體   English   中英

異常未在Async / Await塊中捕獲

[英]Exception not caught in Async / Await block

我只是學習在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;
    }
  }
}

作為stackoverflow問題的答案使用async / await有人建議在工具 - >選項 - >調試 - >常規中“禁用'我的代碼'

在Daniel Hilgarth的評論之后(感謝Daniel!),我看到了一個復制粘貼錯誤。 我在這里糾正了它。 問題仍然存在,但如果您按照建議禁用“只是我的代碼”,則會正確捕獲異常。

所以我想這個問題已經解決了。

問題是這樣的:
您正在拋出Exception但捕獲WebException

兩種解決方案

  1. 拋出WebException
  2. 抓住Exception

解決方案1是首選,因為您實際上不應該拋出非特定的Exception

您正在拋出一個Exception類型,但只捕獲更具體的WebException 捕獲WebException只會捕獲WebException類型的WebException或從中派生的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM