Обработка ошибок
При использовании Microsoft JDBC Driver для SQL Server все состояния ошибок в базе данных возвращаются приложениям Java в виде исключений при помощи класса SQLServerException. Приведенные далее методы класса SQLServerException унаследованы от классов java.sql.SQLException и java.lang.Throwable. Их можно использовать для возвращения конкретной информации о возникшей ошибке SQL Server.
getSQLState()
возвращает стандартный код состояния исключения X/Open или SQL99.getErrorCode()
возвращает специфический номер ошибки базы данных.getMessage()
возвращает полный текст исключения. В тексте сообщения об ошибке описывается проблема и зачастую содержатся заполнители для информации, такие как имена объектов, которые вставляются в сообщение об ошибке во время отображения.getSQLServerError()
возвращает объектSQLServerError
с подробными сведениями об исключении, полученными от SQL Server. Если ошибок не было, этот метод возвращает значение NULL.
Следующие методы класса SQLServerError
можно применить для получения дополнительных сведений об ошибке, созданной на сервере.
SQLServerError.getErrorMessage()
возвращает сообщение об ошибке, которое вернул сервер.SQLServerError.getErrorNumber()
возвращает номер, который обозначает тип ошибки.SQLServerError.getErrorState()
возвращает числовой код ошибки, полученный из SQL Server, который обозначает ошибку, предупреждение или сообщение "данные не найдены".SQLServerError.getErrorSeverity()
возвращает уровень серьезности полученной ошибки.SQLServerError.getServerName()
возвращает имя компьютера, на котором работает создавший ошибку экземпляр SQL Server.SQLServerError.getProcedureName()
возвращает имя хранимой процедуры или удаленного вызова процедуры, в которой произошла ошибка.SQLServerError.getLineNumber()
возвращает номер строки в пакете команд Transact-SQL или хранимой процедуре, в которой произошла ошибка.
В следующем примере открытое подключение к образцу базы данных SQL Server AdventureWorks2022 передается в функцию, и создается неправильно сформированная инструкция SQL, которая не имеет предложения FROM. Далее инструкция выполняется и происходит обработка исключения SQL.
public static void executeSQLException(Connection con) {
try (Statement stmt = con.createStatement();) {
String SQL = "SELECT TOP 10 * Person.Contact";
ResultSet rs = stmt.executeQuery(SQL);
while (rs.next()) {
System.out.println(rs.getString("FirstName") + " " + rs.getString("LastName"));
}
}
catch (SQLException se) {
do {
System.out.println("SQL STATE: " + se.getSQLState());
System.out.println("ERROR CODE: " + se.getErrorCode());
System.out.println("MESSAGE: " + se.getMessage());
System.out.println();
}
while (se != null);
}
}
Использование ServerMessageHandler
Начиная с выпуска 12.8.0 драйвер добавил ServerMessageHandler
дополнительный объем контроля над отзывом об ошибках и ведением журнала. Чтобы использовать ServerMessageHandler
интерфейс, необходимо реализовать ISQLServerMessageHandler
интерфейс. ServerMessageHandler
Функции включают:
Отзыв на сообщение
Позволяет получать отзывы от длительных запросов (например, сообщений о ходе выполнения). Пример: RAISERROR ('Progress message...', 0, 1) WITH NOWAIT
.
Универсальное ведение журнала ошибок
Позволяет обработчику сообщений обрабатывать ведение журнала для всех ошибок.
Универсальная обработка ошибок
Позволяет разместить логику обработки ошибок только ServerMessageHandler
в отличие от повторения той же обработки ошибок во всем приложении.
Повторное изменение серьезности сообщения об ошибке
Позволяет распознавать и изменять серьезность определенных сообщений об ошибках:
SQLServerError.toSQLServerInfoMessage()
ISQLServerMessage
возвращает сообщение об ошибке, созданное путем понижения уровня сообщения об ошибке.SQLServerError.toSQLServerInfoMessage(int newErrorSeverity)
ISQLServerMessage
возвращает сообщение об ошибке, созданное путем понижения уровня сообщения об ошибке с новой серьезностью ошибки.SQLServerError.toSQLServerInfoMessage(int newErrorSeverity, int newErrorNumber)
ISQLServerMessage
возвращает сообщение об ошибке, созданное путем понижения уровня сообщения об ошибке с новым уровнем серьезности ошибок и номером ошибки.SQLServerInfoMessage.toSQLServerError()
ISQLServerMessage
возвращает сообщение об ошибке, созданное путем обновления сообщения сведений до сообщения об ошибке.SQLServerInfoMessage.toSQLServerError(int newErrorSeverity)
ISQLServerMessage
возвращает значение , созданное путем обновления сообщения сведений до сообщения об ошибке с новой серьезностью ошибки.SQLServerInfoMessage.toSQLServerError(int newErrorSeverity, int newErrorNumber)
ISQLServerMessage
возвращает значение , созданное путем обновления сообщения об ошибке до сообщения об ошибке с новым уровнем серьезности ошибок и номером ошибки.
SQLExceptionChaining
Кроме того, при выпуске 12.8.0 sqlExceptions можно объединить в цепочку, поэтому окончательное сообщение об исключении автоматически содержит все исключения, которые могут быть потеряны в противном случае. По умолчанию эта функция включена.