Разница между getCause и getNextException в SQLException?

Глядя на SQLException javadocs, похоже, существует перекрытие между getCause и getNextException. Первый возвращает Throwable, но в остальном они, похоже, почти взаимозаменяемы.

В чем разница между этими двумя? При разработке драйвера JDBC существуют ли рекомендации о том, когда выбрать один из них в качестве механизма цепочки исключения?

Ответ 1

Метод getCause() дает вам причину - если таковой имеется - этого конкретного SQLException. С другой стороны, во время обработки вполне возможно, что существует множество исключений, подумайте о пакетной обработке, ошибках сервера для нескольких параметров запроса (например, слишком долго, ошибки преобразования и т.д.).

Эти множественные исключения находятся на одном уровне (они не связаны друг с другом), поэтому они добавляются в цепочку из SQLException s. Исключением является глава этой цепочки. Чтобы перейти к другому SQLException в цепочке, вы используете getNextException(). Например,

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

С другой стороны, a SQLException также имеет метод public Iterator<Throwable> iterator() (введен в Java 6/JDBC4), это повторяется каждый SQLException и их причины, прежде чем перейти к следующему SQLException в цепочке.

Ответ 2

Операция SQL может завершиться неудачей по нескольким причинам: например, вы можете попытаться обновить несколько строк, а три строки не существуют. Эти три отказа независимы - ни один из них не вызывает другого. То, что getNextException() подходит, и вы можете использовать setNextException() при построении исключения.

С другой стороны, если вся операция потерпела неудачу, поскольку при разговоре с базой данных был IOException, это была основная причина - единственная причина, по которой произошел SQLException, состояла в том, что произошла ошибка IOException. То, что getCause() подходит, - передайте причину конструктору при создании SQLException.

Ответ 3

Выполнение инструкции SQL может приводить к появлению многих SQLExceptions, в частности, если это пакетный оператор. Предположим, вы вставляете 10 строк в одну партию и два сбой: вы получите одно исключение, которое сообщает вам о сбое пакета и что вы должны использовать метод getNextException для доступа к деталям. Это может зависеть только от драйвера базы данных.

Причиной исключения является использование одного исключения в другой, например, для исключения исключения для конкретного приложения, вызванного IO или SQLException.