jdbc exception handling how handle sql exceptions
стадією циклу розробки програмного забезпечення, на якій проводиться програмування, є:
Цей підручник з обробки винятків JDBC пояснює способи обробки винятків SQL за допомогою прикладів програмування:
В Управління транзакціями JDBC підручник з Серія підручників JDBC , ми дізналися типи транзакцій JDBC, типи даних, методи управління транзакціями та те, як їх використовувати в програмах Java.
У цьому підручнику ми дізнаємося про винятки в JDBC та про те, як з ними обробляти. У JDBC, якщо виняток стався через підключення до бази даних або що-небудь пов'язане з БД, воно потрапляє під SQLException. Тут ми побачимо більше інформації про SQLExceptions.
Будьмо готові дізнатись про винятки в JDBC.
Що ви дізнаєтесь:
Обробка винятків JDBC
Винятки трапляються, коли у виконанні програми є помилка або попередження. Коли виникає виняток, нормальний потік програми буде порушено, і програма буде припинено ненормально. Хороша річ у винятку полягає в тому, що ми можемо впоратись із ним за допомогою блоку try-catch або ключового слова throws. Усі винятки та помилки є підкласами класу Throwable. Клас Throwable - базовий клас усіх винятків та помилок.
Обробка винятків Java з ключовими словами
У Java Exception Handling є п’ять ключових слів. Вони такі:
- Спробуйте: Висловлення програм, які можуть спричинити виняток, слід зберігати в блоці try.
- Улов: Якщо в блоці try трапляється будь-який виняток, його буде видано. Ми можемо зловити цей виняток за допомогою блоку Catch і обробити його в коді.
- Кидок: Виключення, генеровані системою, автоматично видаються JVM. Щоб вручну викидати винятки, слід використовувати ключове слово throw.
- Кидки: Будь-який виняток, який був викинутий із методу, повинен вказуватися в реченні throws.
- Нарешті: Будь-які інструкції програми, які повинні бути виконані після блоку try, повинні зберігатися в блоці нарешті.
>> Клацніть тут для отримання додаткової інформації про винятки в Java.
SQLException
У JDBC ми можемо отримати винятки, коли ми виконуємо або створюємо запит. Винятки, що виникають через базу даних або драйвер, потрапляють під SQL Exception. Використовуючи обробку винятків, ми можемо обробляти виняток SQL, як і звичайний виняток.
SQLException доступний у пакеті java.sql. Він поширює клас Exception, що означає, що ми також можемо використовувати методи, доступні в класі Exception, у класі SQLException.
Приклад для винятку SQL
Синтаксична помилка в операторі SQL може спричинити виняток SQL. Коли відбувається таке виняток, об'єкт класу SQLException буде переданий блоку catch. Використовуючи інформацію в об’єкті SQLException, ми можемо вловити цей виняток і продовжити програму.
Об'єкт SQLException має такі методи:
Назва методу | Опис |
---|---|
getErrorCode () | Він повертає номер помилки |
getMessage () | Він повертає повідомлення про помилку |
getSQLState () | Він повертає SQLState об'єкта SQLException. Він також може повернути нуль. Якщо помилка бази даних, вона поверне стан XOPEN SQL |
getNextException () | Він повертає наступний виняток у ланцюжку винятків. |
printStackTrace () | Він друкує поточний виняток та його зворотний шлях до стандартного потоку помилок |
setNextException (SQLEXception ex) | Він використовується для додавання чергового винятку SQL у ланцюжку |
Як обробляти винятки
Виняток, пов'язаний з JDBC, здебільшого створює SQLException, і це перевірений виняток, тому ми повинні або зловити його, або кинути. Вся бізнес-логіка та дані комітів повинні виконуватися в блоці Try, якщо в блоці стався якийсь виняток, ми повинні ловити та обробляти це в блоці Catch. Залежно від типу винятку, ми повинні робити відкоти або фіксувати в блоці Catch.
Категорії винятку SQLE
Іноді драйвер JDBC може видавати підклас SQLException, який представляє загальний стан SQL або загальний стан помилок, який конкретно не пов'язаний з певним значенням класу стану SQL. Це змусить вас обробляти винятки більш конкретно, і ми можемо обробляти це в нашому коді. Ці типи винятків належать до підкласів одного з таких винятків:
- SQLNonTransientException: Цей тип виключення буде видано, коли екземпляр, коли повторна спроба тієї ж операції не вдасться, якщо не буде виправлена причина SQLException.
- SQLTransientException: Цей тип винятку буде застосовано, коли раніше невдала операція зможе досягти успіху, коли ми повторимо операцію знову без будь-яких змін / втручання.
- SQLRecoverableException: Цей тип винятку буде застосовано, коли попередньо невдала операція може досягти успіху, коли ми повторно спробуємо операцію ще раз із будь-якими змінами / втручаннями програми. При цьому поточне з'єднання слід закрити, а нове - відкрити.
Інші підкласи SQLException:
Нижче наведено підкласи SQLException:
- BatchUpdateException: Цей виняток буде видано, якщо під час виконання пакетного оновлення сталася якась помилка. Окрім інформації про SQLException, BatchUpdateException надає статус операторів, які були виконані / оновлені до виникнення помилки.
- SQLClientInfoException: Цей тип виключення буде видано, якщо одне або кілька властивостей інформації не можуть бути встановлені для з'єднання. Окрім інформації SQLException, SQLClientInfoException - список властивостей інформації про клієнта, які не були встановлені.
У цьому посібнику ми побачимо звичайний SQLException, а потім побачимо BatchUpdateException. Ви можете здійснити решту підкласів SQLException у вашій системі.
У наступному прикладі ми детально розберемо, як обробляти виняток.
Усі програми написані на Java, у цьому посібнику. Ми використовували версію Java 8 та Oracle DB.
>> Клацніть тут завантажити програмне забезпечення Oracle
>> Клацніть тут щоб завантажити версію Java 8
Він має покроковий процес встановлення Java.
Приклад програми винятків
package com.STH.JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Exception_Example { public static void main(String() args) throws ClassNotFoundException { // TODO Auto-generated method stub String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011'; //Update query to set the email id for the employee whose empNUM is 10011 Class.forName('oracle.jdbc.driver.OracleDriver'); try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { Statement statemnt1 = conn.createStatement(); ResultSet rs1 =null; statemnt1 = conn.createStatement(); System.out.println('Executing Update query using executeUpdate method'); int return_rows = statemnt1.executeUpdate(update_query); System.out.println('No. of Affected Rows = '+ return_rows); } catch(SQLException sqe) { System.out.println('Error Code = ' + sqe.getErrorCode()); System.out.println('SQL state = ' + sqe.getSQLState()); System.out.println('Message = ' + sqe.getMessage()); System.out.println('printTrace /n'); sqe.printStackTrace(); } } }
Вихід:
Пояснення:
# 1) Створено один запит вибору, який має ім’я стовпця, якого немає в таблиці EMPLOYEE_DETAILS.
Створити запит:
String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011';
# два) Створено підключення, оператор та виконано вибір QUERY у блоці try.
# 3) У блоці Catch ми обробили виняток.
# 4) Ми відображаємо помилку винятку за допомогою методу getError (), SQLState винятку за допомогою методу getSQLState (), повідомлення про виняток за допомогою методу getMessage () та друкуємо трасування стека винятку за допомогою методу printStackTrace.
Приклад BatchUpdateException
Ми створили одну нову таблицю, щоб проілюструвати приклад BatchUpdateException. Назва таблиці - ПРАЦІВНИК. Він має 3 колонки.
Вони є:
- Ідентифікатор, який є первинним ключем
- ПРІЗВИЩЕ
- ІМ'Я
Синтаксис для створення таблиці в ORACLE DB:
CREATE TABLE EMPLOYEE ( ID int NOT NULL PRIMARY KEY, LastName varchar(255), FirstName varchar(255) );
Програма Java:
package com.STH.JDBC; import java.sql.BatchUpdateException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Statement_ExecuteBatch_Example { public static void main(String() args) throws ClassNotFoundException, SQLException { //Inserting the following 3 rows in EMPLOYEE_DETAILS Table String insert_query1 = 'insert into employee values(101,'Patterson','Tony')'; String insert_query2 = 'insert into employee values(102,'Potter','Harry')'; String insert_query3 = 'insert into employee values(102,'Wong','Jane')'; Class.forName('oracle.jdbc.driver.OracleDriver'); //Opening Oracle DB Connection try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { Statement statemnt1 = conn.createStatement(); //Adding the 3 insert queries into the Statement object using addBatch method statemnt1.addBatch(insert_query1); statemnt1.addBatch(insert_query2); statemnt1.addBatch(insert_query3); int No_of_Afffected_Rows()= statemnt1.executeBatch(); //After inserting the data System.out.println('No of rows affected = ' +No_of_Afffected_Rows.length); } //Catching the BatchUpdateException catch(BatchUpdateException be) { //getting the updated rows status before the exception has occurred int() updateCount = be.getUpdateCounts(); int count = 1; for (int i : updateCount) { //Using for loop, printing the statement which has been successfully executed if (i == Statement.EXECUTE_FAILED) { System.out.println('Error on Statement ' + count +': Execution failed'); } else { System.out.println('Statement ' + count +': is executed'); } count++; //Incrementing the count to display the next updated row no. } //System.out.println('Error on statemet '+be.getUpdateCounts()); be.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } }
ВИХІД:
Пояснення:
Що ми зробили у вищезазначеній програмі, так це те, що ми створили 3 запити INSERT, додали його пакетно і виконали. 3рдЗапит має однакове значення ідентифікатора 1вулзапит, оскільки стовпець ID є первинним ключем таблиці EMPLOYEE, програма створила BatchUpdateException.
- Створив 3 запити на вставку, щоб вставити його в таблицю EMPLOYEE. Перший і третій запити мають однакові значення ідентифікатора. Стовпець id є первинним ключем до таблиці EMPLOYEE.
- Створено об'єкт оператора та додано до нього ці 3 запити за допомогою методу addBatch (). Потім викликається метод executeBatch () для його виконання.
- Оскільки перший і третій запити мають однакові значення ідентифікатора. Коли executeBatch () намагається виконати третій запит, він викине BatchUpdateException.
- У блоці BatchUpdateException catch ми викликали метод getUpdateCounts (), щоб отримати статус оновленого рядка.
- Використовуючи цикл for, ми перевіряємо по черзі, чи не вдалося виконати стан конкретного оператора чи ні. Якщо конкретний оператор не вдався, він надрукує номер рядка оператора.
- Після цього він надрукує printStackTrace BatchUpdateException.
- У наведеному вище прикладі, оскільки виняток стався через третє твердження, тому заяви 1 та 2 були надруковані. Потім у консолі виводу надруковано повний слід виключення.
Варто пам’ятати:
- Виняток, що стався через базу даних, потрапляє під SQLException.
- Винятки в Java можна обробити за допомогою блоку try: catch.
- SQLException - це перевірений виняток, тому ми можемо впоратися з ним за допомогою блоку try: catch.
- У нас є кілька підкласів SQLException. Це SQLNonTransientException, SQLTransientException, SQLRecoverableException, BatchUpdateException та SQLClientInfoException.
Часті запитання
Q # 1) Що таке виняток SQL?
Відповідь: Сталося виняток через базу даних, відому як SQL Exception. Виняток, який надає інформацію про базу даних, також відомий як виняток SQL. У нас є клас SQLException на Java, який використовується для надання інформації про виняток. Він має наступні методи:
- getErrorCode ()
- getMessage ()
- getSQLState ()
- printStackTrace ()
- getNextException ()
Q # 2) Як обробити виняток у SQL?
Відповідь: Запишіть бізнес-логіку в блок спроби. Якщо в ньому сталася якась помилка або виняток, схопіть його в блоці Catch і напишіть відповідне повідомлення, щоб легко знайти виняток.
Блок Try – Catch використовується для обробки винятків.
Запитання №3) Коли SQLException може відбуватися в Java?
Відповідь: SQLException виникає, якщо в доступі до бази даних є помилка або інші помилки, пов'язані з базою даних. Коли виникає SQLException, об'єкт типу SQLException буде переданий в речення catch. Ми можемо впоратися з цим в блоці Catch.
Q # 4) Що таке ланцюжок винятків у Java і для чого він корисний?
Відповідь: Один виняток, який спричиняє інший виняток, відомий як ланцюжок винятків або ланцюговий виняток. У більшості випадків нам потрібно зв'язати виняток таким чином, що пов’язує один виняток з іншим винятком, це зробить журнали чіткими та легкими для відстеження. Це буде корисно програмісту в процесі налагодження.
Наприклад:
Розглянемо метод, який видає арифметичний виняток через ділення на нуль. Фактичною причиною винятку є помилка вводу-виводу, через яку дільник дорівнює нулю. Метод лише передасть арифметичний виняток програмісту. Щоб абонент / програміст не дізнався про фактичну причину винятку. У такому типі ситуації ми можемо використовувати ланцюговий виняток.
Висновок
Винятки можна обробляти за допомогою блоку try-catch або кидаючи його. Винятки виникли через базу даних, відому як SQLException. У нас є окремий клас для SQLException, який є підкласом Exception. У нас є методи, щоб детальніше дізнатись про виняток SQL.
Методами є getMessage (), getErrorCode (), getSQLState (), getNextException та printStackTace. getNextException буде використано у випадку з ланцюжком винятків.
Рекомендована література
- Винятки Java та обробка винятків з прикладами
- 10 найкращих винятків селену та способи їх усунення (точний код)
- Повне керівництво по обробці винятків PL SQL з прикладами
- Підручник з обробки винятків C # із прикладами коду
- Обробка винятків у C ++
- Як обробляти винятки у скриптах Groovy SoapUI - Підручник No11 з SoapUI
- PL SQL Підручник для початківців з прикладами Що таке PL / SQL
- PL SQL-пакет: Підручник із пакету Oracle PL / SQL із прикладами