块中的代码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
模式,我们就可以更进一步。为什么不将整个 shebang 替换为自动为您处理对象的using
语句呢?