在finally块中关闭像JDBC资源(如数据库连接)这样的资源时,我是否应该捕获所有异常(捕获Throwable)(比如Spring框架org.springframework.jdbc.support.JdbcUtils.closeConnection(Connection con))或者我应该只捕获SQLException并让它从close()抛出的任何其他未经检查的异常通过屏蔽try部分中的异常来混淆原始调用者,或者当我的代码中的所有内容都正常时抛出异常,而不是仅像Spring Framework那样记录JDBC驱动程序异常?
答案 0 :(得分:1)
请注意,Spring有严重的借口:
"// We don't trust the JDBC driver: It might throw RuntimeException or Error.
“。当您执行需要解释的操作时,您会在代码中添加注释,在这种情况下 - 违反最佳做法。String
,也可以实现更严格的限制。否则,无法抓住OutOfMemoryError
或VirtualMachineError
。不要抓住Throwable
。其子类Error
表示:“An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch.”
此外,捕捉Exception
通常也不合理。即使close()
抛出一个IndexOutOfBoundsException
,你也想尽可能地向你的团队,你的客户和他的SE宣布这一点,因为所有人都应该知道JDBC驱动程序不能值得信赖的。 close()
is only allowed to throw SQLException,期间。
因为,数据库是他们的主要资产,我们需要一个有效的驱动程序。
仅作为最后的手段,例如在本春季示例中,当您知道您将使用有缺陷的驱动程序时,这是可以接受的。
答案 1 :(得分:0)
经过一些研究后,我发现最明智的做法是在关闭资源时捕获任何异常,因为当关闭抛出异常时你不希望你的方法抛出。 Spring Framework JdbcUtils做对了。一些业余程序员认为错误是如此严重的异常应该关闭所有内容,但如果你在servlet上下文中运行,这些错误将不会关闭应用程序服务器,例如,Tomcat StandardWrapperValve,所以你应该这样做,关闭资源时不要让任何错误使你的方法失败。