在最终关闭之前,使用hibernate在catch块中引发异常

在最终关闭之前,使用hibernate在catch块中引发异常,hibernate,exception,try-catch-finally,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块中抛出异常,会话将永远不会关闭。它必须等待池连接超时后才能关闭,对吗?如果是这样的话

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

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

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

始终执行
Finally
块中的代码。
因此,无论是否在
Catch
块中引发异常,会话都将关闭。正如kem在评论中所建议的那样,您应该尝试在调试器中单步执行此代码,并亲自查看确切的行为


作为旁注,您不应该编写
throw ex
,因为这样会将原始异常的调用堆栈重置为执行此throw语句的位置。结果是,您将丢失有关异常实际发生位置的相关信息。相反,您应该只使用
throw
。或者,您可以创建一个新的异常类,并将其
InnerException
设置为
ex
,但这似乎是徒劳的额外工作,除非您需要向堆栈跟踪添加额外信息

当然,上面显示的代码也提出了一个更大的问题,即为什么首先要捕获异常。一旦您将其重写为在
Catch
块中简单地抛出异常,这与您没有首先捕获异常是一样的。相反,为什么不干脆省略
Catch
块,只使用
Try Finally
模式呢

public void myFunc()
{
    Session session = Hibernate.getSession();
    try
    {
        //do something
    }
    finally
    {
        session.Close();
    }
}

然后,一旦我们确定可以修改代码来实现
Try Finally
模式,我们就可以更进一步了。为什么不将整个shebang替换为一个自动处理对象的函数?

即使您从catch块中重新抛出异常,finally块也会执行;在调试器中遍历它。Necro comment:)但我想指出,在Java中(C可能不同)
throw-ex
实际上并没有重写调用堆栈。堆栈在构造时存储在异常对象中,而不是在抛出时。