立即重新抛出catch块并最终使用

时间:2015-04-07 05:07:41

标签: java intellij-idea try-catch-finally rethrow

我有一个负责日志操作的包装器,名为OperationWrapper。它的结构很简单,如下:

public void runOperation(Operation o) throws Exception{ 
     logOperationStarted();
     o.execute();
     logOperationFinished();
}

由于“o”操作可以抛出异常,因此不会始终调用logOperationFinished()方法,因此日志记录无法正常运行。

此外,调用runOperation()方法的各种组件处理这些异常。

我想确保logOperationFinished()始终运行,我实现了以下结构:

public void runOperation(Operation o) throws Exception{ 
     logOperationStarted();
     try{
       o.execute();
     }
     catch(Exception e){
       throw e; 
     }
     finally{
       logOperationFinished();
     }
}

现在logOperationFinished()总是运行,但我收到IntelliJ的警告:

  

立即重新捕获被捕异常
  报告捕获的异常所在的任何 catch 块   立即重新投入,不对其采取任何行动。这样    catch 块是不必要的或缺少错误处理。

对我来说,似乎IntelliJ在发出此警告时没有考虑finally块。

我做错了什么或者有更好的方法来实现这个目标吗?

感谢。

3 个答案:

答案 0 :(得分:5)

是的,你不需要捕获

public void runOperation(Operation o) throws Exception{ 
     logOperationStarted();
     try{
       o.execute();
     }
     finally{
       logOperationFinished();
     }
}

答案 1 :(得分:1)

使用JLS 14.20.2. Execution of try-finally

中的try-finally块
  

如果try块的执行由于任何其他原因R突然完成,则执行finally块,然后有一个选择:

     
      
  1. 如果finally块正常完成,则try语句突然完成,原因为R。

  2.   
  3. 如果finally块因为S而突然完成,那么try语句突然完成原因S(并且原因R被丢弃)。

  4.   
public void runOperation(Operation o) throws Exception{ 
     logOperationStarted();
     try{
        o.execute();
     }finally{
       logOperationFinished();
     }
}

如果你想使用try-catch-finally仍然不是问题,你可以忽略IntelliJ的警告,或者从catch块中抛出新的异常。

throw new ExceptionYouWantToThrow(e);

答案 2 :(得分:0)

异常是否可以恢复?如果不是,则抛出错误可能是适当的,而不是重新抛出异常。

可怕的袋熊的答案很可能就是你所追求的。

throw new Error(e);

Exception vs Error