[英]Can I execute multiple Catch blocks?
這有點抽象,但是有沒有辦法拋出異常並讓它進入多個catch塊? 例如,如果它匹配特定異常后跟非特定異常。
catch(Arithmetic exception)
{
//do stuff
}
catch(Exception exception)
{
//do stuff
}
擁有不同類型的多個捕獲塊是完全可以接受的。 但是,行為是第一個候選塊處理異常。
它不會進入BOTH catch塊。 匹配異常類型的第一個catch塊將處理該特定異常,而不處理其他異常,即使它在處理程序中重新拋出。 一旦異常進入catch塊,將跳過任何后續的。
為了在BOTH塊中捕獲異常,您需要嵌套塊,如下所示:
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塊捕獲。
雖然有異常處理,但這讓我感到沮喪。 我希望你能做點什么
catch (ArgumentNullExcpetion, ArugmentOutOfRangeException ex)
{
}
而不是必須做
catch (ArgumentNullExcpetion e)
{
}
catch (ArugmentOutOfRangeException outOfRange)
{
}
我理解反對這個的理由,你可能會為不同的例外做不同的事情,但有時我想要結合它們。
您不能有多個異常塊處理相同的異常。 但你可以做的是捕獲一般異常,然后嘗試轉換為更具體的,如下所示:
catch (Exception exception)
{
var aex = exception as ArithmeticException
if (aex != null)
{
// do stuff specific to this exception type
}
// then do general stuff
}
如果您使用的是VB.NET,則可以將Arithmetic異常中的錯誤處理程序抽象為始終返回false的函數或方法調用。
然后你可以這樣寫:
Catch ex as Arithmetic When HandleArithmetic()
Catch ex as Exception
End Try
並不是說我會提倡這種用法,雖然我之前已經看過它建議用於日志記錄。 我不相信有一個C#等價物。
這稱為異常過濾,在C#中不受支持(我告訴它可以在VB.NET中使用)。
一個解決方法是捕獲一般異常,然后檢查catch塊中的異常類型,並在繼續執行塊的其余部分之前對其進行任何特定處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.