2010-10-27 171 views
17

這有點抽象,但有沒有什麼可能的方法來拋出異常並讓它進入多個catch塊?例如,如果它匹配一個特定的異常,然後是一個非特定的異常。我可以執行多個Catch塊嗎?

catch(Arithmetic exception) 
{ 
    //do stuff 
} 
catch(Exception exception) 
{ 
    //do stuff 
} 

回答

30

擁有多個不同類型的catch塊是完全可以接受的。但是,行爲是第一個候選塊處理異常。

它不會進入兩個catch塊。與異常類型相匹配的第一個catch塊將處理該特定異常,並且不會處理其他異常,即使它在處理程序中被重新拋出。一旦異常進入catch塊,任何後續的將被跳過。

爲了有陷入兩個區塊異常,你將需要要麼窩塊,像這樣:

try 
{ 
    try 
    { 
     // Do something that throws ArithmeticException 
    } 
    catch(ArithmeticException arithException) 
    { 
     // This handles the thrown exception.... 

     throw; // Rethrow so the outer handler sees it too 
    } 
} 
catch (Exception e) 
{ 
    // This gets hit as well, now, since the "inner" block rethrew the exception 
} 

或者,您可以在基於特定類型的異常,一般異常處理程序過濾。

+2

對於簡單的一級層次結構,嵌套工作正常,但如果共享代碼需要運行幾個不同的異常情況,則可能會匆忙地變醜。這並不意味着與方法不一致,而是一種觀察並不總是合適的。 – tvanfosson 2010-10-27 16:42:58

+0

@tvanfosson:是的,這就是爲什麼我還添加了過濾選項。你的選擇也很好。 – 2010-10-27 16:47:07

18

不可以在兩個catch塊中爲單個異常執行代碼。

我可能會重構泛型異常塊中的代碼爲可以從任何一個被調用的東西。

try 
{ 
    // blah blah blah 
{ 
catch(Arithmetic ae) 
{ 
    HandleArithmeticException(ae); 
    HandleGenericException(ae); 
} 
catch(Exception e) 
{ 
    HandleGenericException(e); 
} 
1

您不能有多個異常塊處理相同的異常。但你可以是趕上一般例外,然後嘗試投射到更具體的,是這樣的:

catch (Exception exception) 
{ 
    var aex = exception as ArithmeticException 
    if (aex != null) 
    { 
     // do stuff specific to this exception type 
    } 
    // then do general stuff 
} 
0

這被稱爲異常過濾和C#不支持(有人告訴我它可能在VB.NET中)。

一個解決方法是捕獲一般異常,然後檢查catch塊中的異常類型,並在繼續執行塊的其餘部分之前對其執行任何特定處理。

1

像其他人一樣,這個異常將被最具體的catch塊捕獲。

雖然有異常處理,但卻帶來了我的沮喪。我希望你能這樣做

catch (ArgumentNullExcpetion, ArugmentOutOfRangeException ex) 
{ 

} 

而不必做

catch (ArgumentNullExcpetion e) 
{ 
} 
catch (ArugmentOutOfRangeException outOfRange) 
{ 
} 

我明白這對你可能是不同的異常做不同的事情,但有時我想結合他們的推理。

+1

這兩個都不是來自ArgumentException - 如果你真的想爲兩者做同樣的事情,只需要捕獲ArgumentException。如果你只想捕獲子異常,那麼你需要使用條件邏輯過濾(並重新拋出)ArgumentException。你的一般觀點是好的,但這不是最好的例子。也許像ValidationException(模型錯誤)和SqlException(違反約束)類似的地方它們不在同一個層次結構中是一個更好的例子。 – tvanfosson 2010-10-27 16:49:31

+1

當你說「異常將被最具體的catch塊捕獲」時,我不認爲你的100%正確。這也取決於順序。所以,如果你有一個所有的東西,所有東西都將永遠屬於那個,即使你有更具體的東西 – jon 2010-10-27 16:51:01

+0

tvanfosson。接得好。我剛剛做了這個例子。你是對的,我可以在這種情況下趕上一般的父母異常。但是,是的,我想要一種方法來捕獲一個catch塊中的多個非相關的異常類型 – 2010-10-27 18:09:25

2

如果您使用的是VB.NET,可以將Arithmetic異常中的錯誤處理程序抽象爲函數或方法調用,該函數或方法調用始終返回false。

然後,你可以寫這樣的:

Catch ex as Arithmetic When HandleArithmetic() 
Catch ex as Exception 

End Try 

不,我會主張這種用法,雖然我已經看到它之前,建議進行日誌記錄。我不相信有一個C#等價物。

相關問題