C# 用完全相同的代码合并catch块?
出于代码重用的原因,我希望在以下代码中合并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
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 ...
}