Поделиться через


Обработка ошибок

Скачать драйвер JDBC

При использовании 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 можно объединить в цепочку, поэтому окончательное сообщение об исключении автоматически содержит все исключения, которые могут быть потеряны в противном случае. По умолчанию эта функция включена.

См. также

Диагностика проблем с JDBC Driver