2015-06-26 52 views
4

我只是學習在windows窗體應用程序中使用異步/等待,試圖讓我的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; 
    } 
    } 
} 

作爲對計算器問題Correct Way to Throw and Catch Exceptions using async/await的回答,有人建議在 工具 - >選項 - >調試 - >常規「禁用'只是我的代碼''

經過Daniel Hilgarth的評論(感謝Daniel!),我看到了一個複製粘貼錯誤。我在這裏糾正了它。問題仍然存在,但如果按照建議禁用「只是我的代碼」,則可以正確捕獲異常。

所以我想問題就解決了。

+1

無再現。在沒有調試器的情況下運行,或者在中斷後繼續運行。你的例外很好。 –

+0

但是,請閱讀Task.Run()並等待,它不是理想的組合。 –

回答

1

你扔Exception類型,但只捕捉更具體的WebException。捕獲WebException只會捕獲WebException類型的異常或從中派生的類型。

+0

你是對的,複製 - 粘貼問題,即使修正後仍然無法使用。然而,禁用「只是我的代碼」解決了這個問題,我會糾正這個問題 –

3

問題是這樣的:
你在投擲Exception但是抓到WebException

兩個解決方案:

  1. 拋出一個WebException
  2. 趕上Exception

解決方法1是首選,因爲你確實不應該拋出非特異性Exception

+0

你是對的,複製 - 粘貼問題,即使修正後仍然無法使用。然而,禁用「只是我的代碼」解決了這個問題,我會糾正這個問題 –