为什么 SQLException 是已检查的异常 [已关闭]

谁能想到一个合理的理由,为什么SQLException是一个检查的例外?

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

但实际上100%的时间(一旦你在生产环境中运行),没有任何问题。

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

被检查在整个代码中会产生大量敷衍的块,任何参与使用JDBC的项目的人都会证明这一点。代码混乱是严重的。try catch

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

通常,调用 SQL 如下所示:

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

这样的代码不会增加任何价值。您无法采取任何合理的措施来恢复。你也可以让运行时异常冒泡 - 即SQLException应该是运行时(未检查)异常。


答案 1

实际上100%的时间没有任何问题 - 这仅限于你自己的观察,而其他系统却没有说明。世界各地有各种各样的计算机系统存在各种瓶颈。您的成功率几乎是100%。其他人必须处理低得多的百分比。

常见的误解是考虑按检查异常发生的频率引入/删除该异常。选中的异常用作通信通道。如您所知,每种方法都有其公共接口。通过这种方式,方法告诉我们它接受哪些参数以及其主体中代码的结果是什么。

当当前正在进行的方法无法兑现其承诺(例如返回值)时,它需要一种方法来告诉另一种方法,即出现问题并且无法执行预期的操作。但是怎么做呢?以返回的值发送消息不起作用,调用方法几乎没有机会区分正确的值和错误消息。并不是说某些方法具有 void 作为返回值。那么,当您无法遵守由方法的接口定义的承诺时,该怎么办?好吧,你抛出一个异常(发送一条消息)。

如果您期望 ResultSet 并且没有与数据库建立连接,该怎么办?返回空的结果集 ?地狱不,这告诉我们数据库是空的。返回空值 ?好吧,这只会委托问题,并使查找原因变得不清楚。

您可以使用该空结果集,并使其成为对另一个数据库的另一个查询的一部分,使其不一致。

如果没有 SQLException,即使一个错误也可能导致数据不一致。


答案 2

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

另一个由Martin Fowler在他的伟大著作“重构”中提供,建议验证它是否是调用调用方法责任进行检查,这可能会导致异常。

如果调用方方法应在调用被调用方法之前执行检查(例如,确保参数不为空),则如果尚未进行此检查,则显然是编程错误,然后被调用方法应引发未经检查的异常。

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

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

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