SQLException 的“链”背后的语义是什么?对象,这与 Throwable
类上的 getCause
方法形成的相似(隐式)链有何不同?
由于 SQLException
也是一个 Throwable
,该类的一个实例可以有两个这样的“链”:
- 由一系列
getNextException()
调用定义 - 直到最终返回 null - 另一个由一系列
getCause()
调用定义 - 直到最终返回 null
...在这种情况下,这两条链将如何相互关联?
最佳答案
SQLException.setNextException(Exception)
和 SQLException.getNextException()
允许从单个方法调用返回多个不同的 SQLException
。这些 SQLException
不是彼此导致的。
实际发生的情况很少见,但假设我执行了一个带有 2 个参数的准备好的插入语句。其中一个参数太长,另一个为空,而该列为 NOT NULL
。数据库可以(尽管我相信大多数数据库不会)将这两个错误报告给驱动程序。但由于 executeUpdate
方法只能抛出一个 SQLException
,因此这些错误使用 setNextException
链接在一起。这样您就可以找出两种错误情况
还要注意 SQLException
有一个 iterator()
方法,它允许您遍历每个 SQLException
及其原因(即:当前 SQLException
、当前 SQLException
的所有原因、下一个 SQLException
如果有的话
它类似于对 SQLWarning
使用 getNextWarning()
如果发生多个警告(并发或顺序),它们将链接在一起。 SQLWarning
不会抛出,但会在生成警告的对象上可用(例如 Connection.getWarnings()
、 Statement.getWarnings()
等)。此方法返回第一个警告,并允许您使用 getNextWarning()
发现其他警告。
关于java - 链式 java.lang.SQLException 实例与 Throwable#getCause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21779161/