Как поймать определенное исключение в JDBC?

Как поймать определенные исключения в JDBC? Примеры: исключение первичного ключа или исключение внешнего ключа.

10
задан Willi Mentzel 22 July 2015 в 20:37
поделиться

3 ответа

SQLException содержит некоторую информацию, относящуюся к базе данных, связанную с исключением. Из док:

Каждое SQLException обеспечивает несколько Виды информации:

1) строка описывая ошибку. Это используется как Сообщение о исключительном состоянии Java, доступно через метод getmesage.

2) «SQLState» строка, которая следует либо в xopen SQLState Conventions или SQL 99 конвенции. Значения Строка SQLState описана в соответствующий спектр. DatabaseMetadata метод getsqlstateType может быть использован для Узнайте, возвращает ли драйвер Тип Xopen или тип SQL 99.

3) Целочисленный код ошибки, который специфичен для каждый поставщик. Обычно это будет фактический код ошибки, возвращаемый Основная база данных.

4) цепь к следующему Исключение. Это может быть использовано для обеспечения Дополнительная информация об ошибке.

7
ответ дан 3 December 2019 в 13:47
поделиться

Лучшим и независимым от БД способом обработки SQLException более конкретно является определение кода состояния SQL, который может быть получен с помощью SQLException#getSQLState(). SQLState - это 5-ти значный код, из которых первые два являются общими для всех БД, а последние три могут различаться в зависимости от БД и/или конкретного условия. Вот выдержка из spec:

  • 02: no data
  • 07: dynamic SQL error
  • 08: connection exception
  • 0A: feature not supported
  • 21: cardinality violation
  • 22: data exception
  • 23: integrity constraint violation
  • 24: недействительное состояние курсора
  • 25: недействительное состояние транзакции
  • 26: недействительное имя SQL-оператора
  • 28: недействительная спецификация авторизации
  • 2B: дескрипторы зависимых привилегий все еще существуют
  • 2C: недействительное имя набора символов
  • 2D: недопустимое завершение транзакции
  • 2E: недопустимое имя соединения
  • 33: недопустимое имя дескриптора SQL
  • 34: недопустимое имя курсора
  • 35: недопустимое условие номер
  • 3C: неоднозначное имя курсора
  • 3D: недопустимое имя каталога
  • 3F: invalid schema name

Так что, чтобы определить, вызвано ли ограничение SQL Exception нарушением, можно просто сделать следующее в (вымышленном) SQLUtil классе:

public static boolean isConstraintViolation(SQLException e) {
    return e.getSQLState().startsWith("23");
}
25
ответ дан 3 December 2019 в 13:47
поделиться

Брайан прав, SQLException будет брошен как раз по поводу ЛЮБОЙ проблемы с JDBC. Отчасти поэтому JDBC так раздражает. JDBC помощники библиотеки Spring предоставляют переводчик исключений для просмотра SQLCode, SQLState и т.д., и бросают соответствующее DataAccessException. Существует множество этих классов исключений, и они дают вам лучшее представление о том, что пошло не так, с такими именами, как DataIntegrityViolationException, DataSourceLookupFailureException, PermissionDeniedDataAccessException и другими.

.
5
ответ дан 3 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: