9

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

这有可能吗?

谢谢。

4

3 回答 3

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 ...
}
于 2009-12-12T12:32:18.197 回答
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

于 2009-12-12T12:08:00.323 回答
1

如果你有一个体面的异常层次结构,你只能做这样的事情,然后你可以捕获层次结构中更高类型的异常。但是,异常层次结构在设计上是相当浅的,并且不能保证您会希望仅基于层次结构以相同的方式处理异常。除此之外......这些都对您的示例中使用的标准异常类型没有帮助。

于 2009-12-12T12:15:45.583 回答