为什么封闭的“finally”块不应该以“throw”语句退出?

时间:2018-01-08 10:11:41

标签: java jtest

我正在使用Jtest进行代码审查。 JTest报告指出“封闭的”最后“块”不应该以“抛出”声明退出“。什么原因? &安培;我该怎么解决? 我在自定义异常&中包装异常该方法已经抛出。

代码如下:

public HashMap methodName(Connection conn, HashMap hMap) throws MyCustomException {
 try
 {}
 catch(SQLException)
 {}
 catch(Exception)
 {}
 finally
 {
   try
   {}
   catch(SQLException e)
   {
     mLog.fatal("Error Msg", e);
     throw new MyCustomException("msg", e);
   }
 }
}

2 个答案:

答案 0 :(得分:0)

这是因为在finally块中抛出异常将导致异常进一步传播(超出try-catch块)。这在某种意义上违背了try catch块的目的。但是,可能存在实际可能有帮助的情况。

答案 1 :(得分:0)

会隐藏原始例外。

由于一个方法调用只能抛出一个异常,finally块中的异常将完全替换并隐藏方法主要部分的异常。

你想要抛出最终的例外吗?

不这样做会使事情变得更容易,而且往往是一个正确的决定。

通常,finally块意味着关闭某些资源。所以,如果方法体能够读取所要求的结果,我认为这是成功的,即使该方法无法关闭某些资源,所以我将其记录为警告并继续(然后报告也会很高兴。

但也许你决定采用另一种方式:如果finally块中出现问题,你会发现methodName()调用失败,你必须表明你的失败是呼叫者。然后,您最终可能会遇到两个相互竞争的异常,您必须决定将哪一个抛给您的来电者。你应该记录另一个,所以它不会完全丢失。

主体通常是更有趣的,但不容易访问:你必须在try-catch-finally块之外引入一个Exception变量,初始化为null,在那里存储任何主体异常,所以你可以从finally块中抛出那个。结果代码会很奇怪......

所以我会继续你的方法(如果你在finally块中确定一个异常是完整方法的失败),只需确保记录原始异常。这将导致双重日志条目,应该避免,但最好记录两次,而不是永远。