5

我有一个负责记录操作的包装器,名为 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块是不必要的或缺少错误处理。

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

我做错了什么还是有更好的方法来实现这一点?

谢谢。

4

3 回答 3

8

是的,你不需要抓住

public void runOperation(Operation o) throws Exception{ 
     logOperationStarted();
     try{
       o.execute();
     }
     finally{
       logOperationFinished();
     }
}
于 2015-04-07T05:09:08.743 回答
2

使用JLS 14.20.2 中的 try-finally 块。try-finally 的执行

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

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

  2. 如果 finally 块由于原因 S 突然完成,则 try 语句由于原因 S 突然完成(并且原因 R 被丢弃)。

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

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

throw new ExceptionYouWantToThrow(e);
于 2015-04-07T05:16:16.510 回答
0

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

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

throw new Error(e);

异常与错误

于 2015-04-07T05:15:40.623 回答