在最终关闭之前,使用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
实际上并没有重写调用堆栈。堆栈在构造时存储在异常对象中,而不是在抛出时。