多捕获或异常层次结构

时间:2019-06-17 09:23:38

标签: java exception try-catch

与“清理代码”更一致。使用Multicatching或创建一个超类Exception并捕获它。

try {
      //some action     
} catch (Exception1 | Exception2 e) {
      //some action after exception    
}

Exception1 extends SuperClassException  
Exception2 extends SuperClassException

try {
       //some action     
} catch (SuperClassException e) {
      //some action after exception    
}

3 个答案:

答案 0 :(得分:2)

  

与“清理代码”更一致。使用Multicatching或创建一个超类Exception并捕获它。

清洁代码在这里并没有帮助。我想不出任何指向这两个选项之一的不同规则。因此,我认为这可以归结为(个人/团队)风格。

最后,两种方法各有利弊:

第一个更详细,因为它告诉您完全会捕获哪些异常。您看着它,就知道了。

第二个隐藏了这一事实,因为您实际上看不到“多少”个例外可能属于该类别。但是,当然,在某种程度上,多重捕获也存在相同的问题,因为您也可以捕获一个或多个基本异常类型。

从这个角度来看,我的建议是:

  • 当您有几个个不同的异常时,只需列出这些异常(尤其是当当前没有可用于替代的独特超类时)
  • 当不需要特定类型信息时,可以肯定,只捕获一个超级类型的东西

答案 1 :(得分:1)

后者,只要您的项目定义了超类,并且所有子类均与catch子句同等相关,并且将以相同的方式处理。

在代码中使用更少的异常类型可以提高可读性,从而减轻的负担。但是,当捕获超类和各个相关子类之间存在语义差异时,就失去了这一优势。

但是,如果子类异常之一在抛出时需要特殊处理,或者对于日志记录方法特别感兴趣,那么您将需要使用单独的catch块。

答案 2 :(得分:1)

您必须考虑情况。如果层次结构已经存在,并且您想捕获特定层次结构分支中的所有类,则可以很好地捕获超类。

话虽如此,我绝对不会创建额外的结构来减少行数-特别是如果异常之间没有明确的IS依赖性,而您只是基于本能创建超类时,“也许这两个属于一起,因为我在同一个地方抓他们”。您正在减少工作量,但在类层次结构中增加了额外的复杂性-IMHO使代码更难分析,并增加了预测其行为所需的时间。