Разница между 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.