2009-12-12 80 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 ... 
} 
相关问题