jdbc exception handling how handle sql exceptions
въпроси за интервю за javascript за опитни професионалисти
Този урок за обработка на изключения JDBC обяснява начините за обработка на SQL изключения с помощта на примери за програмиране:
В JDBC Управление на транзакции урок на JDBC серия уроци , научихме JDBC типове транзакции, типове данни, методи за управление на транзакции и как да ги използваме в Java програми.
В този урок ще научим за изключенията в JDBC и как да се справим с тях. В JDBC, ако изключението е възникнало поради свързаност с база данни или нещо свързано с DB, то ще попадне под SQLException. Тук ще видим повече информация за SQLExceptions.
Нека се приготвим да научим за изключенията в JDBC.
Какво ще научите:
Обработка на изключения JDBC
Изключения възникват, когато има грешка или предупреждение при изпълнението на програмата. Когато възникне изключение, нормалният поток на програмата ще се наруши и програмата ще бъде прекратена необичайно. Хубавото на изключението е, че можем да се справим с него с помощта на try-catch блок или хвърля ключова дума. Всички изключения и грешки са подкласовете на клас Throwable. Класът за хвърляне е основният клас за всички изключения и грешки.
Java обработка на изключения от ключови думи
В обработката на изключения в Java има пет ключови думи. Те са както следва:
- Опитвам: Изявленията на програмата, които могат да предизвикат изключение, трябва да се съхраняват в блока за опитване.
- Улов: Ако възникне някакво изключение в блока try, то ще бъде хвърлено. Можем да хванем това изключение с помощта на блока Catch и да го обработим в кода.
- Хвърли: Генерираните от системата изключения автоматично се изхвърлят от JVM. За да изхвърлим ръчно изключенията, трябва да използваме хвърляне на ключова дума.
- Хвърляния: Всяко изключение, което е изхвърлено от метод, трябва да бъде посочено с клауза за хвърляне.
- И накрая: Всички програмни инструкции, които трябва да бъдат изпълнени след блока try, трябва да се съхраняват в блока final.
>> Щракнете тук за повече информация относно изключенията в Java.
SQLException
В JDBC може да получим изключения, когато изпълним или създадем заявката. Изключенията, които възникват поради базата данни или драйвер, попадат под SQL Exception. Използвайки обработка на изключения, можем да обработваме SQL изключението, както се справяме с нормалното изключение.
SQLException се предлага в пакета java.sql. Той разширява класа Exception, което означава, че можем да използваме и методите, налични в класа Exception в класа SQLException.
Пример за SQL изключение
Синтаксичната грешка в оператора SQL може да доведе до SQL изключение. Когато възникне такова изключение, обект от класа SQLException ще бъде предаден на блока catch. Използвайки информацията в обекта SQLException, можем да хванем това изключение и да продължим програмата.
Обектът SQLException има следните методи:
Име на метода | Описание |
---|---|
getErrorCode () | Той връща номера на грешката |
getMessage () | Той връща съобщението за грешка |
getSQLState () | Той връща SQLState на обекта SQLException. Може да върне и null. За грешка в базата данни тя ще върне XOPEN SQL състояние |
getNextException () | Той връща следващото изключение във веригата на изключенията. |
printStackTrace () | Той отпечатва текущото изключение и обратното му проследяване към стандартен поток за грешка |
setNextException (SQLEXception ex) | Използва се за добавяне на друго SQL изключение във веригата |
Как да се справя с изключенията
Изключението, свързано с JDBC, хвърля най-вече SQLException и е проверено изключение, така че трябва или да го хванем, или да го хвърлим. Цялата бизнес логика и данните за фиксиране трябва да се извършват в блок Try, ако в блока се случи някакво изключение, трябва да го хванем и обработим в блока Catch. Въз основа на типа изключение, ние трябва да направим отмените или да се ангажираме в блока Catch.
Категории на SQLException
Понякога 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 колони.
Те са:
- ID, който е първичен ключ
- ФАМИЛИЯ
- ПЪРВО ИМЕ
Синтаксис за създаване на таблица в 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 заявки и го добавихме в пакет и го изпълнихме. 3rdзаявката има същата стойност на id 1улзаявка, тъй като колоната ID е първичен ключ на таблицата EMPLOYEE, програмата е хвърлила BatchUpdateException.
- Създадоха 3 заявки за вмъкване, за да ги вмъкнете в таблицата EMPLOYEE. Първата и третата заявка имат една и съща стойност на ID. Колоната id е първичен ключ към таблицата EMPLOYEE.
- Създаден обект на оператор и добавени към него тези 3 заявки с помощта на метода addBatch (). След това се извиква метод executeBatch (), за да се изпълни.
- Тъй като първата и третата заявка имат една и съща стойност на ID. Когато executeBatch () се опита да изпълни третата заявка, тя ще хвърли BatchUpdateException.
- В блока BatchUpdateException catch призовахме метода getUpdateCounts (), за да получим състоянието на актуализирания ред.
- Използвайки цикъл for, проверяваме един по един дали състоянието на конкретния оператор се изпълнява неуспешно или не. Ако конкретният оператор не е неуспешен, той ще отпечата номера на реда на изявлението.
- След това ще отпечата printStackTrace на BatchUpdateException.
- В горния пример, тъй като изключението е възникнало поради третото твърдение, така че изявленията 1 и 2 са отпечатани. След това пълната следа от изключението е отпечатана в изходната конзола.
Точки за запомняне:
- Изключението, възникнало поради базата данни, ще попадне под SQLException.
- Изключенията в Java могат да се обработват с помощта на блока try: catch.
- SQLException е провереното изключение, за да можем да се справим с него чрез try: catch блок.
- Имаме някои подкласове на SQLException. Те са SQLNonTransientException, SQLTransientException, SQLRecoverableException, BatchUpdateException и SQLClientInfoException.
често задавани въпроси
В # 1) Какво е SQL изключение?
Отговор: Възникна изключение поради базата данни е известно като SQL Exception. Изключение, което предоставя информация за свързана база данни, е известно и като SQL Exception. Имаме клас SQLException в Java, който се използва за предоставяне на информация за изключението. Той има следните методи:
- getErrorCode ()
- getMessage ()
- getSQLState ()
- printStackTrace ()
- getNextException ()
В # 2) Как да се справя с изключението в SQL?
Отговор: Напишете бизнес логиката в блока try. Ако в него е възникнала някаква грешка или изключение, хванете го в блока Catch и напишете съответното съобщение, за да намерите изключението лесно.
Блокът Try-Catch се използва за обработка на изключението.
В # 3) Кога може да възникне SQLException в Java?
Отговор: SQLException възниква, ако има грешка в достъпа до базата данни или други грешки, свързани с базата данни. Когато възникне SQLException, обект от тип SQLException ще бъде предаден на клаузата catch. Можем да се справим в блока Catch.
В # 4) Каква е веригата за изключения в Java и каква е ползата от нея?
Отговор: Едно изключение, което причинява друго изключение, е известно като верига на изключения или верижно изключение. В повечето случаи трябва да веригираме изключението, което свързва едно изключение с друго, това ще направи регистрационните файлове ясни и лесни за проследяване. Това ще бъде полезно за програмиста в процеса на отстраняване на грешки.
Например:
Помислете за метод, който хвърля аритметично изключение поради разделяне на нула. Действителната причина за изключението е I / O грешка, която прави делителя нула. Методът ще хвърли само аритметично изключение на програмиста. Така че повикващият / програмистът няма да разбере за действителната причина за изключението. В този тип ситуации можем да използваме верижно изключение.
Заключение
Изключенията могат да бъдат обработвани с помощта на блок за опити за улавяне или чрез неговото изхвърляне. Възникнали изключения поради базата данни е известна като SQLException. Имаме отделен клас за SQLException, който е подклас на изключение. Разполагаме с методите, за да опознаем по-конкретно SQL изключението.
Методите са getMessage (), getErrorCode (), getSQLState (), getNextException и printStackTace. getNextException ще се използва в случая с вериги на изключения.
Препоръчително четене
- Изключения на Java и обработка на изключения с примери
- Топ 10 изключения от селен и как да се справим с тях (точен код)
- Пълно ръководство за PL SQL обработка на изключения с примери
- C # Урок за обработка на изключения с примери за кодове
- Обработка на изключения в C ++
- Как да се справям с изключенията в скриптове на SoapUI Groovy - Урок № 11 за SoapUI
- PL SQL Урок за начинаещи с примери | Какво е PL / SQL
- PL SQL пакет: Урок за Oracle PL / SQL пакет с примери