最后在关闭之前在休眠块中抛出一个异常

时间:2010-12-30 03:20:08

标签: hibernate exception try-catch-finally

所以,我想要一些确认。我将用伪代码解释。

public void myFunc() throws Exception{
 Session session = Hibernate.getSession();
 try{
    //do somthing
 } catch(Exception ex){
  throw ex;
 } finally{
  session.close();
 }
}

因此,如果在try块中抛出异常,则永远不会关闭会话。它必须在关闭之前等待池连接超时,对吧?如果是这样,用hibernate捕获异常是否有更好的做法?

1 个答案:

答案 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,它会自动为你处理物体?