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

C# 用完全相同的代码合并catch块?,c#,.net,exception-handling,try-catch,code-reuse,C#,.net,Exception Handling,Try Catch,Code Reuse,出于代码重用的原因,我希望在以下代码中合并catch块: try { DoSomeInputOutput(); } catch (InvalidOperationException ex) { HandleKnownException1(ex); } catch (InvalidDataException ex) { HandleKnownException1(ex); } catch (ArgumentNullException ex) { HandleKnow

出于代码重用的原因,我希望在以下代码中合并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);
}
这有可能吗

谢谢。

否(或者至少:除非您想要分组的异常恰好共享该组特有的公共基类,而在您的示例中,这些异常没有);在这个场景中,您唯一可以做的事情就是捕获(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); }
(或者别的什么)


在某些方面,这也与这个问题有关:。

只有当您有一个合适的异常层次结构时,才能执行类似的操作,然后才能捕获层次结构中更高级别的异常类型。然而,异常层次结构在设计上是相当肤浅的,并且不能保证您希望仅基于层次结构以相同的方式处理异常。而且。。。所有这些对于您的示例中使用的标准异常类型都没有帮助。

假设您在多个位置执行此操作。如果是,为什么不这样做:

{
    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 ...
}