合并具有完全相同代码的 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 块? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将具有相同值的多行合并为pandas中的一行

为啥 new Date(dateString) 在具有完全相同输入的不同设备上返回两个不同的日期? [复制]

如何通过 JavaScript 访问一些具有相同名称的变量? [复制]

如果在 catch 块中抛出异常,是不是会执行 finally 块? [复制]

在 try-catch 块中包装循环会导致性能问题吗? [复制]

对不同类型的两个 Promise 使用相同的 then/catch/finally 块