0

所以,我想对此进行一些确认。我将用伪代码解释。

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

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

4

1 回答 1

2

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


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

当然,您上面显示的代码也提出了一个更大的问题,即为什么您首先要捕获异常。一旦你将它重写为块throw中的异常Catch,这与你一开始就没有捕获异常是一样的。相反,为什么不干脆完全省略Catch块并满足于Try-Finally模式呢?

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

然后,一旦我们确定可以更改代码以实现该Try-Finally模式,我们就可以更进一步。为什么不将整个 shebang 替换为自动为您处理对象的using语句呢?

于 2010-12-30T09:43:15.440 回答