簡體   English   中英

我可以執行多個Catch塊嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM