为什么SQLException是一个经过检查的异常

Boh*_*ian 21 java coding-style exception unchecked checked

任何人都可以想到为什么SQLException是一个检查异常的理性原因?

是的,查询中可能存在语法错误
是,连接可能已经死亡
是的,可能存在权限问题
等等等等等等等等等等等等等

但几乎100%的时间(一旦你在生产中运行),没有任何问题.

如果出现问题,调用代码无法执行任何恢复操作,因此应该取消选中.

被检查会try catch在整个代码中创建大量的敷衍块,因为任何参与过使用JDBC的项目的人都会证明这一点.代码混乱很重要.

由于SQL的深奥性质,你可能得到SQLException及其复杂性的原因很多,这意味着你基本上无法恢复,除非异常是由临时网络问题引起的,但即便在同步调用中,你仍然会陷入困境因为您无法无限期地等待解决网络问题,所以您将不得不使交易失败.

通常,调用SQL看起来像这样:

try {
    // make some SQL call(s)
} catch {SQLException e) { 
    // log the exception
    return; // and give up
}
Run Code Online (Sandbox Code Playgroud)

这样的代码没有增加价值.没有什么合理的你可以恢复.您也可以让运行时异常冒泡 - 即SQLException应该是运行时(未经检查)异常.

Ada*_*ion 2

有几种方法可以解决受控与不受控的困境。检查调用代码是否可以从异常中恢复是一种方法,但是,我同意,这种方法并不能解释为什么SQLExcption受检查的异常。

另一项由 Martin Fowler 在他的伟大著作《重构》中提供,建议验证调用或被调用方法是否有责任进行可能导致异常的检查。

如果调用者方法应该在调用被调用方法之前执行检查(例如,确保参数不为空),那么如果尚未完成此检查,则显然是编程错误,然后被调用方法应该抛出未经检查的异常。

现在,如果由被调用方法负责进行检查,因为只有该方法才能知道如何执行此类检查,那么应该检查从被调用方法抛出的异常。

如果SQLException我认为只有这个班才能知道:

  • 查询中存在语法错误,因为这取决于数据库
  • 连接已断开
  • 存在权限问题

  • 好的,我同意,在大多数情况下,您的应用程序在这种情况下将无法恢复。但如果出现“连接已断开”的情况,它可以通过重新建立与数据库的连接来轻松恢复。我想,您感知异常是否可恢复的方式仅取决于调用方法的作者,这意味着它不能用作决定检查异常与未检查异常的标准。 (2认同)