這有點抽象,但有沒有什麼可能的方法來拋出異常並讓它進入多個catch塊?例如,如果它匹配一個特定的異常,然後是一個非特定的異常。我可以執行多個Catch塊嗎?
catch(Arithmetic exception)
{
//do stuff
}
catch(Exception exception)
{
//do stuff
}
這有點抽象,但有沒有什麼可能的方法來拋出異常並讓它進入多個catch塊?例如,如果它匹配一個特定的異常,然後是一個非特定的異常。我可以執行多個Catch塊嗎?
catch(Arithmetic exception)
{
//do stuff
}
catch(Exception exception)
{
//do stuff
}
擁有多個不同類型的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
}
或者,您可以在基於特定類型的異常,一般異常處理程序過濾。
不可以在兩個catch塊中爲單個異常執行代碼。
我可能會重構泛型異常塊中的代碼爲可以從任何一個被調用的東西。
try
{
// blah blah blah
{
catch(Arithmetic ae)
{
HandleArithmeticException(ae);
HandleGenericException(ae);
}
catch(Exception e)
{
HandleGenericException(e);
}
您不能有多個異常塊處理相同的異常。但你可以做是趕上一般例外,然後嘗試投射到更具體的,是這樣的:
catch (Exception exception)
{
var aex = exception as ArithmeticException
if (aex != null)
{
// do stuff specific to this exception type
}
// then do general stuff
}
這被稱爲異常過濾和C#不支持(有人告訴我它可能在VB.NET中)。
一個解決方法是捕獲一般異常,然後檢查catch塊中的異常類型,並在繼續執行塊的其餘部分之前對其執行任何特定處理。
像其他人一樣,這個異常將被最具體的catch塊捕獲。
雖然有異常處理,但卻帶來了我的沮喪。我希望你能這樣做
catch (ArgumentNullExcpetion, ArugmentOutOfRangeException ex)
{
}
而不必做
catch (ArgumentNullExcpetion e)
{
}
catch (ArugmentOutOfRangeException outOfRange)
{
}
我明白這對你可能是不同的異常做不同的事情,但有時我想結合他們的推理。
這兩個都不是來自ArgumentException - 如果你真的想爲兩者做同樣的事情,只需要捕獲ArgumentException。如果你只想捕獲子異常,那麼你需要使用條件邏輯過濾(並重新拋出)ArgumentException。你的一般觀點是好的,但這不是最好的例子。也許像ValidationException(模型錯誤)和SqlException(違反約束)類似的地方它們不在同一個層次結構中是一個更好的例子。 – tvanfosson 2010-10-27 16:49:31
當你說「異常將被最具體的catch塊捕獲」時,我不認爲你的100%正確。這也取決於順序。所以,如果你有一個所有的東西,所有東西都將永遠屬於那個,即使你有更具體的東西 – jon 2010-10-27 16:51:01
tvanfosson。接得好。我剛剛做了這個例子。你是對的,我可以在這種情況下趕上一般的父母異常。但是,是的,我想要一種方法來捕獲一個catch塊中的多個非相關的異常類型 – 2010-10-27 18:09:25
如果您使用的是VB.NET,可以將Arithmetic異常中的錯誤處理程序抽象爲函數或方法調用,該函數或方法調用始終返回false。
然後,你可以寫這樣的:
Catch ex as Arithmetic When HandleArithmetic()
Catch ex as Exception
End Try
不,我會主張這種用法,雖然我已經看到它之前,建議進行日誌記錄。我不相信有一個C#等價物。
對於簡單的一級層次結構,嵌套工作正常,但如果共享代碼需要運行幾個不同的異常情況,則可能會匆忙地變醜。這並不意味着與方法不一致,而是一種觀察並不總是合適的。 – tvanfosson 2010-10-27 16:42:58
@tvanfosson:是的,這就是爲什麼我還添加了過濾選項。你的選擇也很好。 – 2010-10-27 16:47:07