2011-03-21 67 views
16

考慮以下幾點:C#:多個catch子句

try { 
    FileStream fileStream = new FileStream("C:\files\file1.txt", FileMode.Append); } 
catch (DirectoryNotFoundException e) 
    { MessageBox.Show("Directory not found. " + e.Message); } 
catch (IOException e) 
    { MessageBox.Show("Other IO Error. " + e.Message); } 
catch (Exception e) 
    { MessageBox.Show("Other Error. " + e.Message); } 

將一個DirectoryNotFoundException例外得到所有三個catch條款或處理的只是第一個?

回答

26

只是第一個。異常不會傳播到全部匹配catch子句。

從C#4屬,節8.9.5:

第一catch子句指定異常類型或異常類型的一個基本類型被認爲是匹配。 [...]如果找到匹配的catch子句,則通過將控制轉移到該catch子句的塊來完成異常傳播。

這裏的「完成」部分表示控制轉移後,這是特殊處理的結束。

3

只有第一個。捕捉塊不會經過。

1

只有第一個1,第1匹配的catch子句將處理異常

3

只有第一個匹配的catch 漁獲例外,你應該以任何理由需要再次cacth它,你將不得不再次把它所以「外部」捕捉caluses將能夠捕捉它。

1

這是處理異常的正確方法 - 從最具體的異常類型開始並返回。不過,要記住,如果你無法解決或處理異常,不要理解它。例如,我假設你的代碼是在一些文件訪問方法中,我會刪除最後一個catch(Exception)塊,因爲在這裏你無能爲力(如果它是堆棧溢出,內存不足或者某些情況其他嚴重的系統異常...)

+1

您應該始終捕獲所有異常,因爲用戶不應該看到堆棧跟蹤等異常的一般顯示。 – 2011-03-21 13:44:48

+4

不,總是**。最通用的異常只能在表示層的頂部捕獲,因爲這是唯一可以對它們做任何事情的地方(顯示一個很好的錯誤信息)。 – MattDavey 2011-03-22 12:11:56