使用完全相同的代码合并catch块?

时间:2009-12-12 12:05:08

标签: c# .net exception-handling try-catch code-reuse

为了代码重用原因,我想合并以下代码中的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);
}

这有可能吗?

感谢。

3 个答案:

答案 0 :(得分: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 ...
}

答案 1 :(得分: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

答案 2 :(得分:1)

如果您有一个体面的异常层次结构,那么您只能执行此类操作,然后您可以捕获层次结构中较高类型的异常。但是,异常层次结构在设计上意味着非常浅,并且无法保证您希望以仅基于层次结构的相同方式处理异常。除此之外......这些都不会对您的示例中使用的标准异常类型有所帮助。