jdbc exception handling how handle sql exceptions
java, vývojár, rozhovor, otázky a odpovede pre nováčikov
Tento výukový program Spracovanie výnimiek JDBC vysvetľuje spôsoby spracovania výnimiek SQL pomocou príkladov programovania:
V Správa transakcií JDBC návod na Séria výukových programov JDBC , naučili sme sa typy transakcií JDBC, dátové typy, metódy riadenia transakcií a ako ich používať v programoch Java.
V tomto tutoriále sa dozvieme o výnimkách v JDBC a o tom, ako s nimi zaobchádzať. Ak v JDBC došlo k výnimke z dôvodu pripojenia k databáze alebo z dôvodu niečoho, čo súvisí s databázou DB, bude spadať pod SQLException. Tu uvidíme viac informácií o SQLExceptions.
Poďme sa pripraviť na to, aby sme sa dozvedeli viac o výnimkách v JDBC.
Čo sa dozviete:
Spracovanie výnimiek JDBC
Výnimky sa vyskytujú, keď sa pri vykonávaní programu vyskytne chyba alebo varovanie. Ak dôjde k výnimke, bude narušený normálny tok programu a program bude abnormálne ukončený. Dobré na výnimke je, že ju môžeme zvládnuť pomocou kľúčového slova try-catch block alebo throws. Všetky výnimky a chyby sú podtriedami triedy Throwable. Hádzateľná trieda je základnou triedou všetkých výnimiek a chýb.
Kľúčové slová pre spracovanie výnimiek Java
Pri spracovávaní výnimiek Java existuje päť kľúčových slov. Sú to tieto:
- Vyskúšajte: Programové príkazy, ktoré môžu vyvolať výnimku, by sa mali uchovávať v rámci bloku try.
- Úlovok: Ak sa v bloku try vyskytne nejaká výnimka, bude vyhodená. Tú výnimku môžeme chytiť pomocou bloku Catch a zvládnuť ju v kóde.
- Hod: Systémom generované výnimky automaticky vyvolá JVM. Na ručné použitie výnimiek by sme mali použiť kľúčové slovo throw.
- Hody: Akákoľvek výnimka, ktorá bola vyhodená z metódy, by mala byť špecifikovaná doložkou throws.
- Nakoniec: Všetky programové príkazy, ktoré sa musia vykonať po bloku try, by sa mali ponechať v bloku konečne.
>> Kliknite tu ďalšie informácie o výnimkách v prostredí Java.
SQLException
V JDBC môžeme získať výnimky, keď vykonáme alebo vytvoríme dotaz. Výnimky, ktoré sa vyskytnú v dôsledku databázy alebo ovládača, spadajú pod výnimku SQL. Pomocou spracovania výnimiek môžeme s výnimkou SQL zaobchádzať ako s bežnou výnimkou.
SQLException je k dispozícii v balíku java.sql. Rozširuje triedu Exception, čo znamená, že môžeme používať aj metódy dostupné v triede Exception v triede SQLException.
Príklad pre výnimku SQL
Chyba syntaxe v príkaze SQL môže mať za následok výnimku SQL. Keď dôjde k takejto výnimke, objekt triedy SQLException sa odovzdá do bloku catch. Použitím informácií v objekte SQLException môžeme túto výnimku zachytiť a pokračovať v programe.
Objekt SQLException má nasledujúce metódy:
Názov metódy | Popis |
---|---|
getErrorCode () | Vráti číslo chyby |
getMessage () | Vráti chybové hlásenie |
getSQLState () | Vráti SQLState objektu SQLException. Môže sa tiež vrátiť na nulu. V prípade chyby databázy vráti stav XOPEN SQL |
getNextException () | Vráti nasledujúcu výnimku v reťazci výnimiek. |
printStackTrace () | Vytlačí aktuálnu výnimku a jej spätný chod do štandardného toku chýb |
setNextException (SQLEXception ex) | Používa sa na pridanie ďalšej výnimky SQL v reťazci |
Ako postupovať pri výnimkách
Výnimka súvisiaca s JDBC väčšinou hodí SQLException a je to kontrolovaná výnimka, takže ju musíme buď chytiť, alebo vyhodiť. Všetky dáta obchodnej logiky a potvrdenia by sa mali robiť v bloku Try, ak sa v bloku vyskytla nejaká výnimka, mali by sme ju zachytiť a spracovať v bloku Catch. Na základe typu výnimky by sme mali vykonať vrátenie alebo potvrdenie v bloku Catch.
Kategórie SQLException
Ovládač JDBC niekedy môže vyvolať podtriedu SQLException, ktorá predstavuje spoločný stav SQL alebo bežný chybový stav, ktorý konkrétne nie je spojený s konkrétnou hodnotou triedy stavu SQL. Umožní vám to zvládnuť výnimku konkrétnejším spôsobom a my to môžeme vyriešiť v našom kóde. Tieto typy výnimiek patria do podtried jednej z nasledujúcich výnimiek:
- SQLNonTransientException: Tento typ výnimky bude vyvolaný, keď dôjde k zlyhaniu inštancie, kde by pokus o rovnakú operáciu zlyhal, pokiaľ nebude opravená príčina SQLException.
- SQLTransientException: Tento typ výnimky bude vyvolaný, keď je predtým neúspešná operácia schopná uspieť, keď sme ju znova vyskúšali bez akejkoľvek zmeny / zásahu.
- SQLRecoverableException: Tento typ výnimky bude vyvolaný, keď môže zlyhať predtým zlyhaná operácia, keď sme ju znova vyskúšali s akoukoľvek zmenou / zásahom aplikácie. Pritom by sa malo ukončiť súčasné pripojenie a malo by sa otvoriť nové pripojenie.
Ďalšie podtriedy SQLException:
Nasledujú podtriedy SQLException:
- BatchUpdateException: Tento typ výnimky bude vyvolaný, ak sa počas operácie dávkovej aktualizácie vyskytla chyba. Okrem informácií SQLException poskytuje BatchUpdateException stav príkazov, ktoré boli vykonané / aktualizované predtým, ako sa vyskytla chyba.
- SQLClientInfoException: Tento typ výnimky bude vyvolaný, ak na pripojení nebude možné nastaviť jednu alebo viac informačných vlastností. Okrem informácií SQLException, SQLClientInfoException zoznam vlastností informácií o klientovi, ktoré neboli nastavené.
V tomto tutoriáli uvidíme normálnu SQLException a potom uvidíme BatchUpdateException. Zvyšné podtriedy SQLException môžete cvičiť vo svojom systéme.
V nasledujúcom príklade sa dozvieme, ako zaobchádzať s výnimkou.
Všetky programy sú v tomto výučbe napísané v jazyku Java. Použili sme verziu Java 8 a Oracle DB.
>> Kliknite tu na stiahnutie softvéru Oracle
>> Kliknite tu na stiahnutie Java verzie 8
Má proces inštalácie Java krok za krokom.
Príklad programu výnimiek
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(); } } }
Výkon:
Vysvetlenie:
# 1) Vytvoril sa jeden výberový dotaz, ktorý má názov stĺpca, ktorý sa nenachádza v tabuľke EMPLOYEE_DETAILS.
Vytvoriť dopyt:
String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011';
#dva) Vytvorilo pripojenie, vyhlásenie a vykonalo výber QUERY v bloku try.
# 3) V bloku Catch sme zvládli výnimku.
# 4) Zobrazujeme chybu výnimky pomocou metódy getError (), SQLState výnimky pomocou metódy getSQLState (), správu o výnimke pomocou metódy getMessage () a vytlačíme trasovanie zásobníka výnimky pomocou metódy printStackTrace.
Príklad BatchUpdateException
Vytvorili sme jednu novú tabuľku na ilustráciu príkladu BatchUpdateException. Názov tabuľky je ZAMESTNANEC. Má 3 stĺpce.
Oni sú:
- ID, ktoré je primárnym kľúčom
- PRIEZVISKO
- KRSTNÉ MENO
Syntax na vytvorenie tabuľky v 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(); } } }
VÝKON:
Vysvetlenie:
To, čo sme vykonali vo vyššie uvedenom programe, je, že sme vytvorili 3 VLOŽIŤ dotazy a pridali ich v dávke a vykonali. 3rddopyt má rovnakú hodnotu id 1svdotaz, pretože stĺpec ID je primárnym kľúčom tabuľky ZAMESTNANEC, program vyvolal BatchUpdateException.
- Vytvoril 3 dotazy na vloženie, aby sa vložili do tabuľky ZAMESTNANEC. Prvý a tretí dopyt majú rovnakú hodnotu ID. Stĺpec id je primárnym kľúčom k tabuľke ZAMESTNANEC.
- Vytvoril sa objekt príkazu a do neho sa pridali tieto 3 dotazy pomocou metódy addBatch (). Potom sa na vykonanie zavolala metóda executeBatch ().
- Pretože prvý a tretí dopyt majú rovnakú hodnotu ID. Keď sa executeBatch () pokúsil vykonať tretí dotaz, vyhodí to BatchUpdateException.
- V bloku úlovkov BatchUpdateException sme zavolali metódu getUpdateCounts (), aby sme získali stav aktualizovaného riadku.
- Pomocou slučky for kontrolujeme jeden po druhom, či sa stav konkrétneho príkazu vykonal zlyhal alebo nie. Ak konkrétny výpis zlyhal, vypíše číslo riadku výpisu.
- Potom vytlačí printStackTrace z BatchUpdateException.
- Vo vyššie uvedenom príklade, pretože k výnimke došlo kvôli tretiemu výpisu, boli vyhlásenia 1 a 2 vytlačené. Potom sa celá stopa výnimky vytlačí vo výstupnej konzole.
Body na zapamätanie:
- Výnimka, ku ktorej došlo v dôsledku databázy, bude spadať pod SQLException.
- Výnimky v Jave je možné vyriešiť pomocou bloku try: catch.
- SQLException je kontrolovaná výnimka, takže ju môžeme zvládnuť pomocou bloku try: catch.
- Máme niekoľko podtried SQLException. Sú to SQLNonTransientException, SQLTransientException, SQLRecoverableException, BatchUpdateException a SQLClientInfoException.
často kladené otázky
Otázka 1) Čo je to výnimka SQL?
Odpoveď: Došlo k výnimke z dôvodu databázy známej ako výnimka SQL. Výnimka, ktorá poskytuje informácie o databáze, sa tiež nazýva SQL Exception. V Jave máme triedu SQLException, ktorá slúži na poskytovanie informácií o výnimke. Má nasledujúce metódy:
- getErrorCode ()
- getMessage ()
- getSQLState ()
- printStackTrace ()
- getNextException ()
Otázka 2) Ako spracovať výnimku v SQL?
Odpoveď: Do bloku try napíšte obchodnú logiku. Ak sa v ňom vyskytla chyba alebo výnimka, chyťte ju do bloku Catch a napíšte príslušnú správu, aby ste výnimku ľahko našli.
Na spracovanie výnimky sa používa blok Try – Catch.
Otázka č. 3) Kedy sa môže v jazyku Java vyskytnúť SQLException?
Odpoveď: SQLException sa vyskytne, ak sa vyskytne chyba v prístupe do databázy alebo iné chyby súvisiace s databázou. Keď dôjde k SQLException, objekt typu SQLException sa odošle do klauzuly catch. Zvládneme to v bloku Catch.
Otázka č. 4) Čo je reťazec výnimiek v Jave a na čo sa používa?
Odpoveď: Jedna výnimka, ktorá spôsobí ďalšiu výnimku, sa nazýva Exception Chain alebo Chained Exception. Vo väčšine prípadov musíme reťaziť výnimku tak, aby sa týkala jednej výnimky s ďalšou, vďaka čomu budú protokoly prehľadné a ľahké sledovanie. Bude to užitočné pre programátora v procese ladenia.
Napríklad:
Zvážte metódu, ktorá hodí aritmetickú výnimku z dôvodu delenia nulou. Skutočnou príčinou výnimky je chyba I / O, vďaka ktorej je deliteľ nulový. Metóda vrhne programátorovi iba aritmetickú výnimku. Aby sa volajúci / programátor nedozvedel o skutočnej príčine výnimky. V takomto prípade môžeme použiť pripútanú výnimku.
Záver
Výnimky je možné vyriešiť pomocou bloku try-catch alebo jeho vyhodením. Výnimky nastali kvôli databáze, ktorá sa nazýva SQLException. Pre SQLException máme samostatnú triedu, ktorá je podtriedou Exception. Máme metódy, ako sa o výnimke SQL dozvedieť konkrétnejšie.
Metódy sú getMessage (), getErrorCode (), getSQLState (), getNextException a printStackTace. getNextException sa použije v prípade reťaze Exception Chained.
Odporúčané čítanie
- Výnimky Java a spracovanie výnimiek s príkladmi
- Top 10 selénových výnimiek a ako s nimi zaobchádzať (presný kód)
- Kompletný sprievodca spracovaním výnimiek PL SQL s príkladmi
- Výukový program na spracovanie výnimiek C # s príkladmi kódu
- Spracovanie výnimiek v C ++
- Ako zaobchádzať s výnimkami v skriptoch SoapUI Groovy - SoapUI Tutorial # 11
- Výukový program PL SQL pre začiatočníkov s príkladmi Čo je to PL / SQL
- Balík PL SQL: Výukový program balíkov Oracle PL / SQL s príkladmi