SQLException中getCause和getNextException之间的区别?

时间:2013-06-29 08:06:59

标签: java jdbc

查看SQLException javadocsgetCausegetNextException之间似乎有重叠。第一个返回Throwable,但是否则它们似乎几乎可以互换。

两者有什么区别?在开发JDBC驱动程序时,是否有关于何时选择其中一个作为异常链接机制的指导原则?

3 个答案:

答案 0 :(得分:13)

方法getCause()为您提供特定SQLException的原因(如果有)。另一方面,在处理期间,完全可能发生多个异常,考虑批处理,多个查询参数的服务器端错误(例如,太长,转换错误等)。

这些多个异常处于同一级别(它们不是彼此原因),因此它们被添加到SQLException的链中。这个链的头是抛出的异常。要访问链中的其他SQLException,请使用getNextException()。例如

try {
   // Something that produces multiple SQLExceptions
} catch (SQLException e) {
   SQLException current = e;
   do {
      // do something with current
   } while ((current = current.getNextException()) != null)
}

另一方面,SQLException也有一个方法public Iterator<Throwable> iterator()(在Java 6 / JDBC4中引入),这会迭代每个SQLException及其原因,然后继续下一个{{ {1}}在链中。

答案 1 :(得分:5)

SQL操作可能由于几个独立原因而失败 - 例如,您可能尝试更新多行,并且三行不存在。这三个失败是独立的 - 没有一个导致另一个失败。这是getNextException()合适的地方 - 您可以在构造异常时使用setNextException()

另一方面,如果整个操作失败了因为在与数据库交谈时有IOException,那就是根本原因 - SQLException的唯一原因发生的原因是IOException发生了。这就是getCause()合适的地方 - 在创建SQLException时将原因传递给构造函数。

答案 2 :(得分:5)

执行SQL语句可能会产生许多SQLExceptions,特别是如果它是批处理语句。假设您在一个批处理中插入10行而两个失败:您将收到一个异常,告诉您批处理失败,并且您应该使用getNextException方法来访问详细信息。这可能取决于数据库驱动程序。

在将一个异常包装到另一个异常时使用异常的原因,例如抛出由IO或SQLException引起的特定于应用程序的异常。