所以,我想要一些确认。我将用伪代码解释。
public void myFunc() throws Exception{
Session session = Hibernate.getSession();
try{
//do somthing
} catch(Exception ex){
throw ex;
} finally{
session.close();
}
}
因此,如果在try块中抛出异常,则永远不会关闭会话。它必须在关闭之前等待池连接超时,对吧?如果是这样,用hibernate捕获异常是否有更好的做法?
答案 0 :(得分:2)
始终执行Finally
块中的代码。因此,无论是否在Catch
块中抛出异常,会话都将关闭。正如kem在评论中建议的那样,您应该尝试在调试器中单步执行此代码并查看自己的确切行为。
作为旁注,您永远不应该编写throw ex
,因为这会将原始异常的调用堆栈重置为执行此throw语句的位置。结果是您丢失了有关异常实际发生位置的相关信息。相反,您应该使用throw
。或者,您可以创建一个新的异常类并将其InnerException
设置为ex
,但这似乎是额外的工作,除非您需要向堆栈跟踪添加其他信息。
当然,您上面显示的代码也提出了一个更大的问题,即您首先要捕获异常。一旦你将throw
块中的异常简单地重写为Catch
,那就与你没有首先捕获异常一样。相反,为什么不完全省略Catch
块并仅仅考虑Try-Finally
模式?
public void myFunc()
{
Session session = Hibernate.getSession();
try
{
//do something
}
finally
{
session.Close();
}
}
然后,一旦我们确定代码可以改为实现Try-Finally
模式,我们就可以进一步了解。为什么不用一个using
statement替换整个shebang,它会自动为你处理物体?