我正在使用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);
}
}
}
答案 0 :(得分:0)
这是因为在finally块中抛出异常将导致异常进一步传播(超出try-catch块)。这在某种意义上违背了try catch块的目的。但是,可能存在实际可能有帮助的情况。
答案 1 :(得分:0)
会隐藏原始例外。
由于一个方法调用只能抛出一个异常,finally
块中的异常将完全替换并隐藏方法主要部分的异常。
你想要抛出最终的例外吗?
不这样做会使事情变得更容易,而且往往是一个正确的决定。
通常,finally
块意味着关闭某些资源。所以,如果方法体能够读取所要求的结果,我认为这是成功的,即使该方法无法关闭某些资源,所以我将其记录为警告并继续(然后报告也会很高兴。
但也许你决定采用另一种方式:如果finally
块中出现问题,你会发现methodName()
调用失败,你必须表明你的失败是呼叫者。然后,您最终可能会遇到两个相互竞争的异常,您必须决定将哪一个抛给您的来电者。你应该记录另一个,所以它不会完全丢失。
主体通常是更有趣的,但不容易访问:你必须在try-catch-finally块之外引入一个Exception变量,初始化为null,在那里存储任何主体异常,所以你可以从finally块中抛出那个。结果代码会很奇怪......
所以我会继续你的方法(如果你在finally块中确定一个异常是完整方法的失败),只需确保记录原始异常。这将导致双重日志条目,应该避免,但最好记录两次,而不是永远。