2010-02-18 91 views
20

已經有一個問題發佈here這是非常相似的。我正在更多地擴展這個問題。假設你想捕捉多種類型的異常,但想要以同樣的方式處理它,是否有辦法做類似switch case的事情?try-catch。以相同的方式處理多個異常(或通過下降)

switch (case) 
{ 
    case 1: 
    case 2: 

    DoSomething(); 
    break; 
    case 3: 
    DoSomethingElse() 
    break; 

} 

是否有可能以相同的方式處理少數例外。像

try 
{ 
} 
catch (CustomException ce) 
catch (AnotherCustomException ce) 
{ 
    //basically do the same thing for these 2 kinds of exception 
    LogException(); 
} 
catch (SomeOtherException ex) 
{ 
//Do Something else 
} 
+0

可能重複[一次捕獲多個異常?](http://stackoverflow.com/questions/136035/catch-multiple-exceptions-at-once) – nawfal 2013-05-18 11:08:32

回答

15

目前沒有語言構造來實現你想要的。除非異常都來自基本異常,否則需要考慮將常見邏輯重構爲方法,並從不同的異常處理程序中調用它。

或者你可以做在這個問題解釋說:

Catch multiple Exceptions at once?

我個人傾向於選擇方法爲基礎的方法。

+2

將數據複製到此線程:catch(Exception ex) if(ex是FormatException || ex是OverflowException) WebId = Guid.Empty; return; } throw; }' – 2013-07-12 17:17:51

7

你應該真的有一個BaseCustomException並捕獲它。

0

你不應該捕捉這麼多的自定義異常,但是如果你想要的話,你可以創建一個共同的BaseException並捕獲它。

+0

爲什麼不能? try catch塊中可能有3個自定義庫。 – Gusdor 2015-05-27 07:18:01

+0

你是對的,一般來說,它可以很好地捕捉儘可能多的自定義異常,實際上它是首選,如果你以不同的方式處理它們。 – 2015-05-27 18:44:12

-5

我從來沒有真正做過這樣或類似的事情,而且我沒有訪問編譯器用於測試的目的,但肯定會這樣的工作。不知道如何實際進行類型比較,或者如果C#允許用case語句替換if語句。

try 
{ 
} 
catch (System.Object obj) 
{ 
    Type type; 

    type = obj.GetType() ; 
    if (type == CustomException || type == AnotherCustomException) 
    { 
    //basically do the same thing for these 2 kinds of exception 
    LogException(); 
    } 
    else if (type == SomeOtherException ex) 
    { 
    //Do Something else 
    } 
    else 
    { 
    // Wasn't an exception to handle here 
    throw obj; 
    } 
} 
+0

這可能會起作用,但這不是一個好的解決方案,因爲它忽略了兩個非常基本的事實:a)有一個基本系統Exception類,並且不需要一直到System.Object;和b)爲此目的而存在針對不同異常類的多個catch語句。 – 2010-02-18 19:48:00

+0

我同意阿里森R關於(a)點的觀點,但是關於(b)點,似乎是回答所問的問題的批評。 – torak 2010-02-18 20:00:35

+2

將常見功能分解爲方法並在各種catch()塊中調用它是更優雅的方法,因爲它不需要類型檢查,並且正確使用本機語言構造來進行異常處理。 – 2010-02-18 20:05:12

1

在vb.net中,可以使用異常過濾器來說,例如,

 
    Catch Ex As Exception When TypeOf Ex is ThisException Or TypeOf Ex is ThatException 

不幸的是,無論出於何種原因,C#的實現者都拒絕在C#中寫入異常過濾代碼。

3

這是copied from another posting,但我拉着代碼此主題:

捕捉System.Exception和交換機的類型

catch (Exception ex)    
{     
    if (ex is FormatException || ex is OverflowException) 
    { 
     WebId = Guid.Empty; 
     return; 
    } 

    throw; 
} 

我喜歡這重複幾個catch塊的方法調用。

相關問題