2009-12-12 81 views
8

我想在代碼重用的原因,下面的代碼合併catch塊:用完全相同的代碼合併catch塊?

try 
{ 
    DoSomeInputOutput(); 
} 
catch (InvalidOperationException ex) 
{ 
    HandleKnownException1(ex); 
} 
catch (InvalidDataException ex) 
{ 
    HandleKnownException1(ex); 
} 
catch (ArgumentNullException ex) 
{ 
    HandleKnownException1(ex); 
} 
catch (ArgumentOutOfRangeException ex) 
{ 
    HandleKnownException2(ex); 
} 
catch (ArithmeticException ex) 
{ 
    HandleKnownException2(ex); 
} 
catch (InvalidCastException ex) 
{ 
    HandleKnownException2(ex); 
} 
catch (Exception ex) 
{ 
    HandleUnknownException(ex); 
} 

到這樣的事情:

try 
{ 
    DoSomeInputOutput(); 
} 
catch (InvalidOperationException ex) 
catch (InvalidDataException ex) 
catch (ArgumentNullException ex) 
{ 
    HandleKnownException1(ex); 
} 
catch (ArgumentOutOfRangeException ex) 
catch (ArithmeticException ex) 
catch (InvalidCastException ex) 
{ 
    HandleKnownException2(ex); 
} 
catch (Exception ex) 
{ 
    HandleUnknownException(ex); 
} 

這有可能以某種方式?

謝謝。

回答

5

沒有(或至少是:除非你想要的例外組發生共用一個基類特定於該組,他們在你的例子不);在這種情況下,您唯一可以做的事情是catch (Exception ex)並在ex上進行運行時測試。當你這樣做的時候,我希望你的代碼已經是「更漂亮了」(因爲重要的是,你已經將處理代碼重構爲一個方法)。

我會忍不住來調整間距,以便我可以專注於重要代碼:

try 
{ 
    DoSomeInputOutput(); 
} 
// blah humorous scenario 1 
catch (InvalidOperationException ex) { HandleKnownException1(ex); } 
catch (InvalidDataException ex) { HandleKnownException1(ex); } 
catch (ArgumentNullException ex) { HandleKnownException1(ex); } 
// blah whimsical scenario 2 
catch (ArgumentOutOfRangeException ex) { HandleKnownException2(ex); } 
catch (ArithmeticException ex) { HandleKnownException2(ex); } 
catch (InvalidCastException ex) { HandleKnownException2(ex); } 
// unexpected comedy 
catch (Exception ex) { HandleUnknownException(ex); } 

(或東西)。

在某些方面,這也涉及到這個問題:switch/pattern matching idea

1

如果你有一個體面的異常層次結構,你只能做這樣的事情,那麼你可以捕捉到層次結構中更高級別的異常。但是,異常層次結構在設計上意味着非常淺薄,並且不能保證您只想根據層次結構以相同的方式處理異常。除此之外......這些都不會有助於您的示例中使用的標準異常類型。

7

大概你可以在多個地方做到這一點。如果是這樣,爲什麼你不這樣做:

{ 
    DoSomeInputOutput(); 
} 
catch (Exception ex) 
{ 
    HandleInputException(ex); 
} 

void HandleInputException(Exception ex) 
{ 
    if (ex is InvalidOperationException || ex is InvalidDataException || ex is ArgumentNullException) 
    { 
    HandleKnownException1 (ex); 
    } 
    else if ... 
    else if ... 
} 
相關問題