catch块之后的代码是坏的还是无意义的?

时间:2016-08-04 11:28:14

标签: java exception exception-handling try-catch

我问一个简单的问题。在catch块之后有任何代码是不好的。即我们是否需要将它们包含在try中并在catch中重新抛出包装器异常?

我不是在询问最后的操作。

让我们举个例子。在这里doSomething()方法抛出一个名为'SomeException'的异常。

代码1:

try{
 doSomething();   
}catch(SomeException e){
  throw new AnotherException(e);
}
doAnotherThing();
return someResult;

码2:

try{
   doSomething(); 
   doAnotherThing(); 
   return someResult; 
}catch(SomeException e){
   throw new AnotherException(e);
}  

在上面两个例子中,code2中有加号吗?

3 个答案:

答案 0 :(得分:2)

如果doSomething()没有发生异常,但doAnotherThing()抛出SomeException,则两种情况之间存在差异。

  1. SomeException将在代码中进一步提出。
  2. SomeException将被catch块捕获并再次作为AnotherException重新抛出。
  3. 需要考虑的另一个案例是当catch块没有重新抛出异常时。

    1. 将执行doAnotherThing()
    2. 不会。
    3. 因此,正如其他答案中已经说明的那样,每行有1个try-catch块可以使代码更清晰,避免出现意外行为。另一方面,当你有类似的东西时,我会考虑在同一个块中对多行进行分组

      try {
         doSomething(); // can throw SomeException 
         doAnotherThing(); 
         doSomething(); // can throw SomeException as well  
         return someResult; 
      } catch(SomeException e) {
         throw new AnotherException(e);
      }  
      

      如果我们不关心是doSomething()是第一次还是第二次调用异常,我们都不关心doAnotherThing()是否被调用

答案 1 :(得分:1)

关于"坏"的判断我觉得主观。

我的偏好是每个方法一次try / catch,try中包含所有代码。

编译器不会阻止你在catch之后放置代码。我会在代码审查中引用你。

答案 2 :(得分:0)

样式2的一个问题是,你在try块中放入了更多的代码,它可以意外地捕获你不期望的异常,特别是当它是一个相当高级别的异常或运行时例外。假设您正在尝试将字符串转换为数字并捕获可能的NumberFormatException。因此,假设样式2,您之后使用DoAnotherThing执行更多代码。也许你甚至打电话给图书馆。现在这个库引发了同样的异常,但你正在处理它,就像它来自你自己的代码一样。

出于这个原因,我更喜欢小的try / catch块,除非我真的确定下面的其余代码。但是,当然这很大程度上取决于你实际捕获的异常(来自图书馆的一个自定义的,你在那里打电话显然不会被抛到其他地方)以及代码的可读性等等。 / p>