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

DxC*_*xCK 8 .net c# code-reuse exception-handling try-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);
}
Run Code Online (Sandbox Code Playgroud)

这样的事情:

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);
}
Run Code Online (Sandbox Code Playgroud)

这有可能吗?

谢谢.

yu_*_*sha 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 ...
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 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); }
Run Code Online (Sandbox Code Playgroud)

(或者其他的东西).

在某些方面,这也与这个问题有关:开关/模式匹配的想法.