Spec-Zone .ru
спецификации, руководства, описания, API
|
Эта страница затрагивает следующие темы:
Когда JDBC встречается с ошибкой во время взаимодействия с источником данных, он бросает экземпляр SQLException
в противоположность Exception
. (Источник данных в этом контексте представляет базу данных который a Connection
объект соединяется.) SQLException
экземпляр содержит следующую информацию, которая может помочь Вам определить причину ошибки:
Описание ошибки. Получите String
объект, который содержит это описание, вызывая метод SQLException.getMessage
.
Код SQLState. Эти коды и их соответствующие значения были стандартизированы ISO/ANSI and Open Group (X/Open), хотя некоторые коды были зарезервированы для поставщиков базы данных, чтобы определить для себя. Это String
объект состоит из пяти алфавитно-цифровых символов. Получите этот код, вызывая метод SQLException.getSQLState
.
Код ошибки. Это - целочисленное значение, идентифицирующее ошибку, которая вызвала SQLException
экземпляр, который будет брошен. Его значение и значение специфичны для реализации и могли бы быть фактическим кодом ошибки, возвращенным базовым источником данных. Получите ошибку, вызывая метод SQLException.getErrorCode
.
Причина. A SQLException
у экземпляра могла бы быть причинная связь, которая состоит из один или больше Throwable
объекты, которые вызвали SQLException
экземпляр, который будет брошен. Чтобы переместиться по этой цепочке причин, рекурсивно вызовите метод SQLException.getCause
до a null
значение возвращается.
Ссылка на любые цепочечные исключения. Если больше чем одна ошибка происходит, на исключения ссылаются через эту цепочку. Получите эти исключения, вызывая метод SQLException.getNextException
на исключении, которое было выдано.
Следующий метод, 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
методы, которым позволяют Вы узнать, в котором данные столбца или параметра были усеченными, было ли усечение на операции чтения или операции записи, сколько байтов должно было быть передано, и сколько байтов было фактически передано.
Ваш драйвер JDBC мог бы бросить подкласс SQLException
это соответствует общему SQLState или состоянию распространенной ошибки, которое не связывается с определенным значением class SQLState. Это позволяет Вам записать более переносимый код обработки ошибок. Эти исключения являются подклассами одного из следующих классов:
SQLNonTransientException
SQLTransientException
SQLRecoverableException
См. последний Javadoc java.sql
пакет или документация Вашего драйвера JDBC для получения дополнительной информации об этих подклассах.
Следующие подклассы SQLException
может также быть брошен:
BatchUpdateException
бросается, когда ошибка происходит во время работы пакетного обновления. В дополнение к информации, предоставленной SQLException
, BatchUpdateException
обеспечивает счета обновления для всех операторов, которые выполнялись прежде, чем ошибка произошла.SQLClientInfoException
бросается, когда одно или более свойств информации о клиенте не могли быть установлены на Соединении. В дополнение к информации, предоставленной SQLException
, SQLClientInfoException
обеспечивает список свойств информации о клиенте, которые не были установлены.