Spec-Zone .ru
спецификации, руководства, описания, API
След: JDBC (ТМ) Доступ к базе данных
Урок: Основы JDBC
Обработка SQLExceptions
Домашняя страница > JDBC (ТМ) Доступ к базе данных > Основы JDBC

Обработка SQLExceptions

Эта страница затрагивает следующие темы:

Краткий обзор SQLException

Когда JDBC встречается с ошибкой во время взаимодействия с источником данных, он бросает экземпляр SQLException в противоположность Exception. (Источник данных в этом контексте представляет базу данных который a Connection объект соединяется.) SQLException экземпляр содержит следующую информацию, которая может помочь Вам определить причину ошибки:

Получение Исключений

Следующий метод, JDBCTutorialUtilities.printSQLException выводит SQLState, код ошибки, ошибочное описание, и причину (если есть один), содержавшийся в SQLException так же как любое другое исключение, объединенное в цепочку к этому:

public static void printSQLException(SQLException ex) {

    for (Throwable e : ex) {
        if (e instanceof SQLException) {
            if (ignoreSQLException(
                ((SQLException)e).
                getSQLState()) == false) {

                e.printStackTrace(System.err);
                System.err.println("SQLState: " +
                    ((SQLException)e).getSQLState());

                System.err.println("Error Code: " +
                    ((SQLException)e).getErrorCode());

                System.err.println("Message: " + e.getMessage());

                Throwable t = ex.getCause();
                while(t != null) {
                    System.out.println("Cause: " + t);
                    t = t.getCause();
                }
            }
        }
    }
}

Например, если Вы вызываете метод CoffeesTable.dropTable с DB Java как Ваш DBMS, таблица COFFEES не существует, и Вы удаляете звонок JDBCTutorialUtilities.ignoreSQLException, вывод будет подобен следующему:

SQLState: 42Y55
Error Code: 30000
Message: 'DROP TABLE' cannot be performed on
'TESTDB.COFFEES' because it does not exist.

Вместо выведения SQLException информация, Вы могли вместо этого сначала получить SQLState тогда обработайте SQLException соответственно. Например, метод JDBCTutorialUtilities.ignoreSQLException возвраты true если SQLState> равен коду 42Y55 (и Вы используете DB Java в качестве своего DBMS), который вызывает JDBCTutorialUtilities.printSQLException проигнорировать SQLException:

public static boolean ignoreSQLException(String sqlState) {

    if (sqlState == null) {
        System.out.println("The SQL state is not defined!");
        return false;
    }

    // X0Y32: Jar file already exists in schema
    if (sqlState.equalsIgnoreCase("X0Y32"))
        return true;

    // 42Y55: Table already exists in schema
    if (sqlState.equalsIgnoreCase("42Y55"))
        return true;

    return false;
}

Получение Предупреждений

SQLWarning объекты являются подклассом SQLException то соглашение с предупреждениями доступа к базе данных. Предупреждения не останавливают выполнение приложения, как исключения делают; они просто предупреждают пользователя, что что-то не происходило как запланировано. Например, предупреждение могло бы сообщить, что полномочие, которое Вы попытались отменить, не отменялось. Или предупреждение могло бы сказать Вам, что ошибка произошла во время требуемого разъединения.

О предупреждении можно сообщить относительно a Connection объект, a Statement объект (включая PreparedStatement и CallableStatement объекты), или a ResultSet объект. У каждого из этих классов есть a getWarnings метод, который следует вызвать, чтобы видеть, что первое предупреждает, сообщил относительно объекта вызова. Если getWarnings возвращает предупреждение, можно вызвать SQLWarning метод getNextWarning на этом, чтобы получить любые дополнительные предупреждения. Выполнение оператора автоматически очищает предупреждения от предыдущего оператора, таким образом, они не растут. Это означает, однако, что, если Вы хотите получить предупреждения, о которых сообщают относительно оператора, следует сделать так прежде, чем Вы выполните другой оператор.

Следующие методы от JDBCTutorialUtilities иллюстрируйте, как получить полную информацию о любых предупреждениях, относительно которых сообщают Statement или ResultSet объекты:

public static void getWarningsFromResultSet(ResultSet rs)
    throws SQLException {
    JDBCTutorialUtilities.printWarnings(rs.getWarnings());
}

public static void getWarningsFromStatement(Statement stmt)
    throws SQLException {
    JDBCTutorialUtilities.printWarnings(stmt.getWarnings());
}

public static void printWarnings(SQLWarning warning)
    throws SQLException {

    if (warning != null) {
        System.out.println("\n---Warning---\n");

    while (warning != null) {
        System.out.println("Message: " + warning.getMessage());
        System.out.println("SQLState: " + warning.getSQLState());
        System.out.print("Vendor error code: ");
        System.out.println(warning.getErrorCode());
        System.out.println("");
        warning = warning.getNextWarning();
    }
}

Наиболее распространенное предупреждение является a DataTruncation предупреждение, подкласс SQLWarning. Все DataTruncation у объектов есть SQLState 01004, указание, что была проблема с чтением или записью данных. DataTruncation методы, которым позволяют Вы узнать, в котором данные столбца или параметра были усеченными, было ли усечение на операции чтения или операции записи, сколько байтов должно было быть передано, и сколько байтов было фактически передано.

Категоризированный SQLExceptions

Ваш драйвер JDBC мог бы бросить подкласс SQLException это соответствует общему SQLState или состоянию распространенной ошибки, которое не связывается с определенным значением class SQLState. Это позволяет Вам записать более переносимый код обработки ошибок. Эти исключения являются подклассами одного из следующих классов:

См. последний Javadoc java.sql пакет или документация Вашего драйвера JDBC для получения дополнительной информации об этих подклассах.

Другие Подклассы SQLException

Следующие подклассы SQLException может также быть брошен:


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Соединение с Объектами DataSource
Следующая страница: Установка Таблиц