-1

我正在使用 Jtest 进行代码审查。JTest 报告指出“不应使用“throw”语句退出封闭的“finally”块”。什么原因?&我该如何解决?我将异常包装在自定义异常中,并且该方法有抛出。

代码看起来像:

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);
   }
 }
}
4

2 回答 2

0

它将隐藏原始异常。

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

你想抛出 finally 异常吗?

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

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

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

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

所以我会坚持你的方法(如果你决定 finally 块中的异常是完整方法的失败),只需确保记录原始异常。这将导致双重日志条目,应该避免这种情况,但记录两次总比不记录好。

于 2018-01-08T11:09:39.887 回答
0

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

于 2018-01-08T10:16:17.510 回答