jdbc exception handling how handle sql exceptions
Ten samouczek dotyczący obsługi wyjątków JDBC wyjaśnia sposoby obsługi wyjątków SQL za pomocą przykładów programowania:
w Zarządzanie transakcjami JDBC samouczek Seria samouczków JDBC , poznaliśmy typy transakcji JDBC, typy danych, metody zarządzania transakcjami i sposoby ich wykorzystania w programach Java.
W tym samouczku dowiemy się o wyjątkach w JDBC i jak sobie z nimi radzić. W JDBC, jeśli wyjątek wystąpił z powodu połączenia z bazą danych lub czegokolwiek związanego z DB, przejdzie do SQLException. Tutaj zobaczymy więcej informacji o SQLExceptions.
Przygotujmy się, aby dowiedzieć się więcej o wyjątkach w JDBC.
Czego się nauczysz:
Obsługa wyjątków JDBC
Wyjątki występują, gdy podczas wykonywania programu występuje błąd lub ostrzeżenie. Gdy wystąpi wyjątek, normalny przepływ programu zostanie zakłócony, a program zostanie nieprawidłowo zakończony. Zaletą tego wyjątku jest to, że możemy sobie z nim poradzić, używając bloku try-catch lub słowa kluczowego throws. Wszystkie wyjątki i błędy są podklasami klasy Throwable. Klasa Throwable jest klasą bazową wszystkich wyjątków i błędów.
Słowa kluczowe obsługi wyjątków Java
W obsłudze wyjątków Java znajduje się pięć słów kluczowych. Są one następujące:
- Próbować: Instrukcje programu, które mogą wywołać wyjątek, powinny być przechowywane w bloku try.
- Złapać: Jeśli w bloku try wystąpi jakikolwiek wyjątek, zostanie on zgłoszony. Możemy przechwycić ten wyjątek za pomocą bloku Catch i obsłużyć go w kodzie.
- Rzucać: Wyjątki generowane przez system są automatycznie generowane przez maszynę JVM. Aby ręcznie zgłosić wyjątki, powinniśmy użyć słowa kluczowego throw.
- Rzuty: Każdy wyjątek, który został wyrzucony z metody, powinien być określony przez klauzulę throws.
- Wreszcie: Wszelkie instrukcje programu, które muszą zostać wykonane po bloku try, powinny zostać zachowane w bloku final.
>> Kliknij tutaj aby uzyskać więcej informacji na temat wyjątków w Javie.
SQLException
W JDBC możemy uzyskać wyjątki, gdy wykonujemy lub tworzymy zapytanie. Wyjątki, które występują z powodu bazy danych lub sterownika, należą do wyjątku SQL. Korzystając z obsługi wyjątków, możemy obsłużyć wyjątek SQL tak samo, jak normalny wyjątek.
SQLException jest dostępny w pakiecie java.sql. Rozszerza klasę Exception, co oznacza, że możemy korzystać z metod dostępnych w klasie Exception w klasie SQLException.
Przykład wyjątku SQL
Błąd składni w instrukcji SQL może spowodować wyjątek SQL. Kiedy wystąpi taki wyjątek, obiekt klasy SQLException zostanie przekazany do bloku catch. Korzystając z informacji zawartych w obiekcie SQLException, możemy przechwycić ten wyjątek i kontynuować program.
Obiekt SQLException ma następujące metody:
Nazwa metody | Opis |
---|---|
getErrorCode () | Zwraca numer błędu |
getMessage () | Zwraca komunikat o błędzie |
getSQLState () | Zwraca SQLState obiektu SQLException. Może również zwrócić wartość null. W przypadku błędu bazy danych zwróci stan XOPEN SQL |
getNextException () | Zwraca następny wyjątek w łańcuchu wyjątków. |
printStackTrace () | Drukuje bieżący wyjątek i jego ślad w standardowym strumieniu błędów |
setNextException (SQLEXception ex) | Służy do dodawania kolejnego wyjątku SQL w łańcuchu |
Jak obsługiwać wyjątki
Wyjątek związany z JDBC w większości zgłasza SQLException i jest to sprawdzony wyjątek, więc musimy go złapać lub zgłosić. Cała logika biznesowa i dane dotyczące zatwierdzenia powinny być wykonane w bloku Try, jeśli w bloku wystąpił jakikolwiek wyjątek, powinniśmy go złapać i obsłużyć w bloku Catch. Bazując na typie wyjątku, powinniśmy wykonać wycofanie lub zatwierdzenie w bloku Catch.
Kategorie SQLException
Czasami sterownik JDBC może generować podklasę SQLException, która reprezentuje typowy stan SQL lub typowy stan błędu, który nie jest konkretnie powiązany z określoną wartością klasy stanu SQL. To sprawi, że wyjątek zostanie obsłużony w bardziej szczegółowy sposób i możemy to zrobić w naszym kodzie. Te typy wyjątków należą do podklas jednego z następujących wyjątków:
- SQLNonTransientException: Ten typ wyjątku zostanie zgłoszony, gdy wystąpienie, w którym ponowienie tej samej operacji zakończy się niepowodzeniem, chyba że przyczyna SQLException zostanie poprawiona.
- SQLTransientException: Ten typ wyjątku zostanie zgłoszony, gdy operacja, która wcześniej zakończyła się niepowodzeniem, może się powieść, gdy ponownie spróbujemy ją wykonać bez żadnych zmian / interwencji.
- SQLRecoverableException: Ten typ wyjątku zostanie zgłoszony, gdy operacja, która wcześniej zakończyła się niepowodzeniem, może się powieść, gdy ponownie spróbujemy wykonać operację z jakąkolwiek zmianą / interwencją aplikacji. Robiąc to, bieżące połączenie powinno zostać zamknięte, a nowe otwarte.
Inne podklasy SQLException:
Poniżej przedstawiono podklasy SQLException:
- BatchUpdateException: Ten typ wyjątku zostanie zgłoszony, jeśli wystąpi jakikolwiek błąd podczas wykonywania operacji aktualizacji zbiorczej. Oprócz informacji SQLException, BatchUpdateException podaje status instrukcji, które zostały wykonane / zaktualizowane przed wystąpieniem błędu.
- SQLClientInfoException: Ten typ wyjątku zostanie zgłoszony, jeśli nie można ustawić jednej lub więcej właściwości informacji w połączeniu. Oprócz informacji SQLException, SQLClientInfoException zawiera listę właściwości informacji o kliencie, które nie zostały ustawione.
W tym samouczku zobaczymy normalny wyjątek SQLException, a następnie BatchUpdateException. Możesz ćwiczyć pozostałe podklasy SQLException w swoim systemie.
W poniższym przykładzie omówimy szczegółowo sposób obsługi wyjątku.
Wszystkie programy są napisane w Javie, w tym samouczku. Użyliśmy wersji Java 8 i Oracle DB.
>> Kliknij tutaj aby pobrać oprogramowanie Oracle
>> Kliknij tutaj aby pobrać wersję Java 8
Posiada proces instalacji Java krok po kroku.
Program przykładowy wyjątków
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(); } } }
Wynik:
Wyjaśnienie:
# 1) Utworzono jedno zapytanie wybierające, którego nazwa kolumny nie występuje w tabeli EMPLOYEE_DETAILS.
Utwórz zapytanie:
String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011';
#dwa) Utworzono połączenie, instrukcję i wykonano zapytanie SELECT w bloku try.
# 3) W bloku Catch obsłużyliśmy wyjątek.
# 4) Wyświetlamy błąd wyjątku za pomocą metody getError (), SQLState wyjątku za pomocą metody getSQLState (), komunikat o wyjątku za pomocą metody getMessage () i drukujemy ślad stosu wyjątku za pomocą metody printStackTrace.
Przykład BatchUpdateException
Utworzyliśmy jedną nową tabelę, aby zilustrować przykład BatchUpdateException. Nazwa tabeli to PRACOWNIK. Ma 3 kolumny.
Oni są:
- Identyfikator będący kluczem podstawowym
- NAZWISKO
- IMIĘ
Składnia tworzenia tabeli w ORACLE DB:
CREATE TABLE EMPLOYEE ( ID int NOT NULL PRIMARY KEY, LastName varchar(255), FirstName varchar(255) );
Program 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(); } } }
WYNIK:
Wyjaśnienie:
To, co zrobiliśmy w powyższym programie, to utworzyliśmy 3 zapytania INSERT, dodaliśmy je w partii i wykonaliśmy. 3r & Dzapytanie ma tę samą wartość identyfikatora 1śwzapytanie, ponieważ kolumna ID jest kluczem podstawowym tabeli EMPLOYEE, program zgłosił wyjątek BatchUpdateException.
testy jednostkowe test integracyjny test systemu
- Utworzono 3 zapytania wstawiania, aby wstawić je do tabeli PRACOWNIK. Pierwsze i trzecie zapytanie ma tę samą wartość identyfikatora. Kolumna id jest podstawowym kluczem do tabeli EMPLOYEE.
- Utworzono obiekt instrukcji i dodano do niego te 3 zapytania za pomocą metody addBatch (). Następnie wywołano metodę executeBatch (), aby ją wykonać.
- Ponieważ pierwsze i trzecie zapytanie ma tę samą wartość identyfikatora. Gdy executeBatch () spróbuje wykonać trzecie zapytanie, zgłosi wyjątek BatchUpdateException.
- W bloku BatchUpdateException catch wywołaliśmy metodę getUpdateCounts (), aby uzyskać stan zaktualizowanego wiersza.
- Korzystając z pętli for, sprawdzamy jeden po drugim, czy stan konkretnej instrukcji jest wykonywany, czy nie. Jeśli dana instrukcja nie zakończyła się niepowodzeniem, wydrukuje numer wiersza instrukcji.
- Następnie wydrukuje printStackTrace wyjątku BatchUpdateException.
- W powyższym przykładzie, ponieważ wyjątek wystąpił z powodu trzeciej instrukcji, więc instrukcje 1 i 2 zostały wydrukowane. Następnie pełny ślad wyjątku został wydrukowany w konsoli wyjściowej.
Punkty do zapamiętania:
- Wyjątek, który wystąpił z powodu bazy danych, będzie objęty SQLException.
- Wyjątki w Javie można obsługiwać za pomocą bloku try: catch.
- Wyjątek SQLException jest sprawdzonym wyjątkiem, więc możemy go obsłużyć za pomocą bloku try: catch.
- Mamy kilka podklas SQLException. Są to SQLNonTransientException, SQLTransientException, SQLRecoverableException, BatchUpdateException i SQLClientInfoException.
Często Zadawane Pytania
P 1) Co to jest wyjątek SQL?
Odpowiedź: Wystąpił wyjątek, ponieważ baza danych jest znana jako wyjątek SQL. Wyjątek, który dostarcza informacji dotyczących bazy danych, jest również znany jako wyjątek SQL. Mamy klasę SQLException w Javie, która służy do dostarczania informacji o wyjątku. Ma następujące metody:
- getErrorCode ()
- getMessage ()
- getSQLState ()
- printStackTrace ()
- getNextException ()
Pytanie 2) Jak obsłużyć wyjątek w SQL?
Odpowiedź: Napisz logikę biznesową w bloku try. Jeśli wystąpił jakiś błąd lub wyjątek, przechwyć go w bloku Catch i napisz odpowiednią wiadomość, aby łatwo znaleźć wyjątek.
Do obsługi wyjątku używany jest blok Try – Catch.
Pytanie 3) Kiedy SQLException może wystąpić w Javie?
Odpowiedź: SQLException występuje, jeśli wystąpi błąd w dostępie do bazy danych lub inne błędy związane z bazą danych. Gdy wystąpi SQLException, obiekt typu SQLException zostanie przekazany do klauzuli catch. Poradzimy sobie z tym w bloku Catch.
P # 4) Co to jest łańcuch wyjątków w Javie i do czego służy?
Odpowiedź: Jeden wyjątek, który powoduje inny wyjątek, jest znany jako łańcuch wyjątków lub wyjątek łańcuchowy. W większości przypadków musimy połączyć wyjątek w taki łańcuch, który odnosi się do jednego wyjątku z innym, dzięki czemu dzienniki będą przejrzyste i łatwe do śledzenia. Będzie to pomocne dla programisty w procesie debugowania.
Na przykład:
Rozważ metodę, która zgłasza wyjątek arytmetyczny z powodu dzielenia przez zero. Rzeczywistą przyczyną wyjątku jest błąd we / wy, który powoduje, że dzielnik ma wartość zero. Metoda zgłosi tylko wyjątek arytmetyczny do programisty. Aby dzwoniący / programista nie dowiedział się o rzeczywistej przyczynie wyjątku. W tego typu sytuacjach możemy użyć łańcuchowego wyjątku.
Wniosek
Wyjątki można obsługiwać za pomocą bloku try-catch lub wyrzucając go. Wystąpiły wyjątki, ponieważ baza danych jest znana jako SQLException. Mamy oddzielną klasę dla SQLException, która jest podklasą Exception. Mamy metody, dzięki którym dowiemy się więcej o wyjątku SQL.
Metody to getMessage (), getErrorCode (), getSQLState (), getNextException i printStackTace. getNextException będzie używany w przypadku łańcucha wyjątków.
rekomendowane lektury
- Wyjątki Java i obsługa wyjątków z przykładami
- 10 najlepszych wyjątków selenu i jak sobie z nimi radzić (dokładny kod)
- Kompletny przewodnik po obsłudze wyjątków PL SQL z przykładami
- C # samouczek obsługi wyjątków z przykładami kodu
- Obsługa wyjątków w C ++
- Jak obsługiwać wyjątki w skryptach SoapUI Groovy - samouczek SoapUI nr 11
- Samouczek języka PL SQL dla początkujących z przykładami | Co to jest PL / SQL
- Pakiet PL SQL: Samouczek dotyczący pakietu Oracle PL / SQL z przykładami