查看SQLException javadocsgetCause
,和之间似乎有重叠getNextException
。第一个返回一个 Throwable,但除此之外它们似乎几乎可以互换。
两者有什么区别?在开发 JDBC 驱动程序时,是否有关于何时选择一个而不是另一个作为异常链接机制的指南?
查看SQLException javadocsgetCause
,和之间似乎有重叠getNextException
。第一个返回一个 Throwable,但除此之外它们似乎几乎可以互换。
两者有什么区别?在开发 JDBC 驱动程序时,是否有关于何时选择一个而不是另一个作为异常链接机制的指南?
该方法getCause()
为您提供了特定的原因(如果有的话)SQLException
。另一方面,在处理过程中,完全有可能发生多个异常,例如批处理、多个查询参数的服务器端错误(例如太长、转换错误等)。
这些多个异常处于同一级别(它们不是彼此的原因),因此它们被添加到SQLException
s 链中。这个链的头部是抛出的异常。要到达SQLException
链中的其他 s,请使用getNextException()
. 例如
try {
// Something that produces multiple SQLExceptions
} catch (SQLException e) {
SQLException current = e;
do {
// do something with current
} while ((current = current.getNextException()) != null)
}
另一方面,aSQLException
也有一个方法(在 Java 6/JDBC4 中引入),它在继续到链中的下一个之前public Iterator<Throwable> iterator()
迭代每个方法及其原因。SQLException
SQLException
SQL 操作可能由于几个独立的原因而失败 - 例如,您可能试图更新多行,而三行不存在。这三个故障是独立的——它们都不会导致另一个故障。那getNextException()
是合适的地方 - 您可以setNextException()
在构造异常时使用。
另一方面,如果整个操作失败是因为与数据库交谈时发生IOException
了,那是根本原因——发生的唯一原因SQLException
是因为IOException
发生了。那getCause()
是合适的地方 - 在创建SQLException
.
SQL 语句的执行可能会产生许多 SQLExceptions,尤其是在它是批处理语句时。假设您在一批中插入 10 行,其中两行失败:您将收到一个异常,告诉您该批失败,并且您应该使用 getNextException 方法访问详细信息。不过,这可能取决于数据库驱动程序。
在将一个异常包装到另一个异常时使用异常的原因,例如抛出由 IO 或 SQLException 引起的应用程序特定异常。