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

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