为了代码重用原因,我想合并以下代码中的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);
}
这有可能吗?
感谢。
答案 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)
如果您有一个体面的异常层次结构,那么您只能执行此类操作,然后您可以捕获层次结构中较高类型的异常。但是,异常层次结构在设计上意味着非常浅,并且无法保证您希望以仅基于层次结构的相同方式处理异常。除此之外......这些都不会对您的示例中使用的标准异常类型有所帮助。