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)
这有可能吗?
谢谢.
据推测,你可以在不止一个地方做到这一点.如果是这样,你为什么不这样做:
{
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)
否(或者至少:除非您想要分组的例外碰巧共享特定于该组的公共基类,否则它们不在您的示例中); 在这种情况下你唯一能做的就是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)
(或者其他的东西).
在某些方面,这也与这个问题有关:开关/模式匹配的想法.