在关闭finally块上的JDBC资源时,我应该捕获所有异常还是仅捕获SQLException?

时间:2016-01-07 20:52:28

标签: java exception jdbc

在finally块中关闭像JDBC资源(如数据库连接)这样的资源时,我是否应该捕获所有异常(捕获Throwable)(比如Spring框架org.springframework.jdbc.support.JdbcUtils.closeConnection(Connection con))或者我应该只捕获SQLException并让它从close()抛出的任何其他未经检查的异常通过屏蔽try部分中的异常来混淆原始调用者,或者当我的代码中的所有内容都正常时抛出异常,而不是仅像Spring Framework那样记录JDBC驱动程序异常?

2 个答案:

答案 0 :(得分:1)

请注意,Spring有严重的借口:

  • Spring是一个“非常特殊的应用程序”(与reasonable application相对)。它是成千上万公司中使用的框架,有数百个JDBC实现,无论它们有什么错误,它都需要支持。
  • 他们在评论中专门解释了捕获Throwable的原因:"// We don't trust the JDBC driver: It might throw RuntimeException or Error.“。当您执行需要解释的操作时,您会在代码中添加注释,在这种情况下 - 违反最佳做法。
  • 此代码必须处理数百个JDBC驱动程序版本,其中许多版本使用本机代码并可能产生奇怪的错误。
  • 我相信,Spring的异常处理程序是经过精心手工制作的,不会调用任何内存分配,即使不是一个新的String,也可以实现更严格的限制。否则,无法抓住OutOfMemoryErrorVirtualMachineError

不要抓住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,所以你应该这样做,关闭资源时不要让任何错误使你的方法失败。