合并具有完全相同代码的 catch 块? [复制]
Posted
技术标签:
【中文标题】合并具有完全相同代码的 catch 块? [复制]【英文标题】:Merge catch blocks with exactly the same code? [duplicate] 【发布时间】:2010-12-25 23:29:34 【问题描述】:出于代码重用原因,我想合并以下代码中的 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);
这有可能吗?
谢谢。
【问题讨论】:
【参考方案1】:否(或至少:除非您想要分组的例外情况发生以共享特定于该组的公共基类,但在您的示例中没有);在这种情况下,您唯一能做的就是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】:如果你有一个体面的异常层次结构,你只能做这样的事情,然后你可以捕获层次结构中更高类型的异常。但是,异常层次结构在设计上是相当浅的,并且不能保证您会希望仅基于层次结构以相同的方式处理异常。此外...这些都对您的示例中使用的标准异常类型没有帮助。
【讨论】:
【参考方案3】:大概你在不止一个地方这样做。如果是这样,你为什么不这样做:
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 ...
【讨论】:
以上是关于合并具有完全相同代码的 catch 块? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 new Date(dateString) 在具有完全相同输入的不同设备上返回两个不同的日期? [复制]
如何通过 JavaScript 访问一些具有相同名称的变量? [复制]
如果在 catch 块中抛出异常,是不是会执行 finally 块? [复制]