【发布时间】:2013-05-08 18:13:13
【问题描述】:
谁能想到SQLException 是一个已检查异常的合理原因?
是的,查询中可能存在语法错误
是的,连接可能已断开
是的,可能存在权限问题
等等等等等等等等等等
但几乎 100% 的时间(一旦您在生产环境中运行),没有任何问题。
如果出现问题,调用代码无法进行任何恢复,因此应该取消选中。
检查会在整个代码中创建大量敷衍的try catch 块,任何参与过使用 JDBC 的项目的人都会证明这一点。代码混乱很严重。
由于 SQL 的深奥性,你可能会得到一个 SQLException 的无数原因及其复杂性意味着你基本上无法恢复,除非异常是由临时网络问题引起的,但即使在同步调用中,你'无论如何都会沉没,因为您不能无限期地等待网络问题得到解决,因此您将不得不使交易失败。
通常,调用 SQL 如下所示:
try {
// make some SQL call(s)
} catch {SQLException e) {
// log the exception
return; // and give up
}
这样的代码没有任何价值。您无法采取任何合理的措施来恢复。您不妨让运行时异常冒泡——即 SQLException 应该是 runtime(未经检查的)异常。
【问题讨论】:
-
A) 网络、数据库服务器、负载平衡器等没有 100% 的正常运行时间 B) 当发生故障时,您当然可以做点什么。
-
服务器故障发生的频率比您预期的要高,这是客户端应该处理的事情。 (很可能是通过显示错误消息,稍后再试)。主要是死锁问题。
-
@BrianRoach 好的 - 说网络消失了。调用代码可以做什么来恢复网络?没有!那么,再次,为什么要检查它? Checked 表示调用者可以恢复。
-
@BrianRoach 来自连接池的数据库连接在提供给您使用之前会被检查。您极不太可能遇到连接问题。在所有优秀的应用程序中总会有一个顶级的
catch Exception来捕获未经检查的异常,就像它捕获 NPE 一样;仅仅因为未检查异常并不意味着您的“应用程序将崩溃”。如果您愿意,仍然欢迎您捕获特定的未经检查的异常。 -
@bla 但是
SQLException实际上是Error:您基本上无法从它们中恢复-您的应用程序已被冲洗-并且Errors未选中。为什么不也SQLException。
标签: java exception coding-style checked unchecked