jdbc exception handling how handle sql exceptions
extrahujte e-mailové adresy z webu zdarma
Tento výukový program pro zpracování výjimek JDBC vysvětluje způsoby zpracování výjimek SQL pomocí příkladů programování:
V Správa transakcí JDBC návod na Série výukových programů JDBC , naučili jsme se typy transakcí JDBC, datové typy, metody správy transakcí a jak je používat v programech Java.
V tomto kurzu se dozvíme o výjimkách v JDBC a o tom, jak s nimi zacházet. Pokud v JDBC došlo k výjimce z důvodu připojení k databázi nebo čehokoli souvisejícího s DB, bude spadat pod SQLException. Zde uvidíme více informací o SQLExceptions.
Připravme se na to, abychom se dozvěděli o výjimkách v JDBC.
Co se naučíte:
Zpracování výjimek JDBC
Výjimky nastávají, když dojde k chybě nebo varování při provádění programu. Dojde-li k výjimce, dojde k narušení normálního toku programu a program bude abnormálně ukončen. Dobrou věcí na výjimce je, že ji můžeme zpracovat pomocí klíčového slova try-catch nebo throws. Všechny výjimky a chyby jsou podtřídami třídy Throwable. Throwable class je základní třída všech výjimek a chyb.
Klíčová slova pro zpracování výjimek Java
Ve zpracování výjimek Java existuje pět klíčových slov. Jsou to následující:
- Snaž se: Programové příkazy, které mohou vyvolat výjimku, by měly být uchovávány v bloku try.
- Úlovek: Pokud se v bloku try vyskytne nějaká výjimka, bude vyvolána. Tuto výjimku můžeme zachytit pomocí bloku Catch a zpracovat ji v kódu.
- Házet: Systémem generované výjimky jsou automaticky vyvolány JVM. Chcete-li ručně vyvolat výjimky, měli bychom použít klíčové slovo throw.
- Vrhá: Jakákoli výjimka, která byla vyhozena z metody, by měla být určena klauzulí throws.
- Konečně: Veškeré programové příkazy, které musí být provedeny po bloku try, by měly být uchovány v bloku final.
>> Klikněte tady Další informace o výjimkách v Javě.
SQLException
V JDBC můžeme získat výjimky, když provedeme nebo vytvoříme dotaz. Výjimky, ke kterým dochází v důsledku databáze nebo ovladače, spadají pod výjimku SQL. Pomocí zpracování výjimek můžeme zpracovat výjimku SQL, jako bychom zpracovali normální výjimku.
SQLException je k dispozici v balíčku java.sql. Rozšiřuje třídu Exception, což znamená, že můžeme použít také metody dostupné ve třídě Exception ve třídě SQLException.
Příklad pro výjimku SQL
Chyba syntaxe v příkazu SQL může mít za následek výjimku SQL. Když dojde k takové výjimce, objekt třídy SQLException bude předán bloku catch. Použitím informací v objektu SQLException můžeme tuto výjimku zachytit a pokračovat v programu.
Objekt SQLException má následující metody:
Název metody | Popis |
---|---|
getErrorCode () | Vrátí číslo chyby |
getMessage () | Vrátí chybovou zprávu |
getSQLState () | Vrátí SQLState objektu SQLException. Může také vrátit hodnotu null. U chyby databáze vrátí stav XOPEN SQL |
getNextException () | Vrátí další výjimku v řetězci výjimek. |
printStackTrace () | Vytiskne aktuální výjimku a její zpětný tok na standardní proud chyb |
setNextException (SQLEXception ex) | Používá se k přidání další výjimky SQL v řetězci |
Jak řešit výjimky
Výjimka související s JDBC většinou vyvolá SQLException a je to kontrolovaná výjimka, takže ji musíme buď chytit, nebo hodit. Všechna obchodní logika a data potvrzení by měla být provedena v bloku Try, pokud se v bloku vyskytla nějaká výjimka, měli bychom ji zachytit a zpracovat v bloku Catch. Na základě typu výjimky bychom měli provést vrácení nebo potvrzení v bloku Catch.
Kategorie SQLException
Ovladač JDBC může někdy vyvolat podtřídu SQLException, která představuje běžný stav SQL nebo běžný chybový stav, který konkrétně není spojen s konkrétní hodnotou třídy stavu SQL. Umožní vám zpracovat výjimku konkrétnějším způsobem a my ji můžeme zpracovat v našem kódu. Tyto typy výjimek spadají pod podtřídy jedné z následujících výjimek:
- SQLNonTransientException: Tento typ výjimky bude vyvolán, když instance, kde by opakování stejné operace selhalo, pokud nebyla opravena příčina SQLException.
- SQLTransientException: Tento typ výjimky bude vyvolán, když je dříve úspěšná operace schopna uspět, když jsme operaci znovu vyzkoušeli bez jakékoli změny / zásahu.
- SQLRecoverableException: Tento typ výjimky bude vyvolán, když dříve neúspěšná operace může uspět, když jsme operaci znovu vyzkoušeli s jakoukoli změnou / zásahem aplikace. Současně by mělo být uzavřeno aktuální připojení a mělo by být otevřeno nové připojení.
Další podtřídy SQLException:
Následuje podtřída SQLException:
- BatchUpdateException: Tento typ výjimky bude vyvolán, pokud během operace dávkové aktualizace došlo k nějaké chybě. Kromě informací SQLException poskytuje BatchUpdateException stav příkazů, které byly provedeny / aktualizovány před výskytem chyby.
- SQLClientInfoException: Tento typ výjimky bude vyvolán, pokud na připojení nelze nastavit jednu nebo více vlastností informací. Kromě informací SQLException SQLClientInfoException seznam vlastností informací o klientovi, které nebyly nastaveny.
V tomto kurzu uvidíme normální SQLException a potom uvidíme BatchUpdateException. Ve svém systému můžete cvičit zbývající podtřídy SQLException.
V následujícím příkladu se budeme zabývat tím, jak zpracovat výjimku.
Všechny programy jsou v tomto tutoriálu psány v Javě. Použili jsme verzi Java 8 a Oracle DB.
>> Klikněte tady stáhnout software Oracle
>> Klikněte tady ke stažení Java verze 8
Má postup instalace Java krok za krokem.
Příklad programu výjimek
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ýstup:
Vysvětlení:
# 1) Byl vytvořen jeden výběrový dotaz, který má název sloupce, který není v tabulce EMPLOYEE_DETAILS.
Vytvořit dotaz:
String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011';
#dva) Vytvořilo připojení, příkaz a provedlo výběr QUERY v bloku try.
# 3) V bloku Catch jsme zpracovali výjimku.
# 4) Zobrazujeme chybu výjimky pomocí metody getError (), SQLState výjimky pomocí metody getSQLState (), zprávu o výjimce pomocí metody getMessage () a vytiskneme trasování zásobníku výjimky pomocí metody printStackTrace.
Příklad BatchUpdateException
Vytvořili jsme jednu novou tabulku pro ilustraci příkladu BatchUpdateException. Název tabulky je ZAMĚSTNANEC. Má 3 sloupce.
Oni jsou:
- ID, které je primárním klíčem
- PŘÍJMENÍ
- JMÉNO
Syntaxe pro vytvoření tabulky 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ÝSTUP:
Vysvětlení:
To, co jsme udělali ve výše uvedeném programu, je, že jsme vytvořili 3 INSERT dotazy a přidali jsme je v dávce a provedli. 3rddotaz má stejnou hodnotu id 1Svatýdotaz, protože sloupec ID je primárním klíčem tabulky ZAMĚSTNANCI, program vyvolal BatchUpdateException.
- Vytvořil 3 vkládací dotazy pro jeho vložení do tabulky ZAMĚSTNANEC. První a třetí dotaz má stejnou hodnotu ID. Sloupec id je primárním klíčem k tabulce ZAMĚSTNANEC.
- Vytvořil objekt prohlášení a přidal do něj tyto 3 dotazy pomocí metody addBatch (). Pak se nazývá metoda executeBatch () k jejímu provedení.
- Protože první a třetí dotaz má stejnou hodnotu ID. Když se executeBatch () pokusil provést třetí dotaz, vyvolá BatchUpdateException.
- V bloku catch BatchUpdateException jsme zavolali metodu getUpdateCounts (), abychom získali stav aktualizovaného řádku.
- Pomocí smyčky for po jednom kontrolujeme, zda se stav konkrétního příkazu provedl neúspěšně nebo ne. Pokud konkrétní výpis selhal, vytiskne číslo řádku výpisu.
- Poté vytiskne printStackTrace z BatchUpdateException.
- Ve výše uvedeném příkladu, protože k výjimce došlo kvůli třetímu příkazu, byly vytištěny příkazy 1 a 2. Poté byla ve výstupní konzole vytištěna úplná stopa výjimky.
Body k zapamatování:
- Výjimka, ke které došlo kvůli databázi, bude spadat pod SQLException.
- Výjimky v Javě lze vyřešit pomocí bloku try: catch.
- SQLException je kontrolovaná výjimka, takže ji můžeme zpracovat pomocí bloku try: catch.
- Máme několik podtříd SQLException. Jsou to SQLNonTransientException, SQLTransientException, SQLRecoverableException, BatchUpdateException a SQLClientInfoException.
Často kladené otázky
Otázka č. 1) Co je to výjimka SQL?
Odpovědět: Došlo k výjimce, protože databáze je známá jako SQL Exception. Výjimka, která poskytuje informace o databázi, se také nazývá SQL Exception. V Javě máme třídu SQLException, která slouží k poskytování informací o výjimce. Má následující metody:
- getErrorCode ()
- getMessage ()
- getSQLState ()
- printStackTrace ()
- getNextException ()
Otázka 2) Jak zacházet s výjimkou v SQL?
Odpovědět: Napište obchodní logiku do bloku Try. Pokud v něm došlo k nějaké chybě nebo výjimce, chyťte ji v bloku Catch a napište příslušnou zprávu, abyste snadno našli výjimku.
Pro zpracování výjimky se používá blok Try – Catch.
Otázka č. 3) Kdy může v Javě dojít k SQLException?
Odpovědět: SQLException nastane, pokud dojde k chybě v přístupu k databázi nebo jiným chybám souvisejícím s databází. Když dojde k SQLException, objekt typu SQLException bude předán klauzuli catch. Zvládneme to v bloku Catch.
Otázka č. 4) Co je řetězec výjimek v Javě a jaké je jeho použití?
Odpovědět: Jedna výjimka, která způsobí další výjimku, se nazývá Exception Chain nebo Chained Exception. Ve většině případů potřebujeme zřetězit výjimku tak, aby se vztahovala jedna výjimka k jiné výjimce, aby byly protokoly jasné a snadné sledování. To bude užitečné pro programátora v procesu ladění.
Například:
Zvažte metodu, která vyvolá aritmetickou výjimku kvůli dělení nulou. Skutečnou příčinou výjimky je chyba I / O, díky níž je dělitel nulový. Metoda vyvolá programátorovi pouze aritmetickou výjimku. Aby se volající / programátor nedozvěděl o skutečné příčině výjimky. V tomto typu situace můžeme použít zřetězenou výjimku.
Závěr
Výjimky lze řešit pomocí bloku try-catch nebo házením. Došlo k výjimkám kvůli databázi, která se nazývá SQLException. Máme samostatnou třídu pro SQLException, což je podtřída výjimky. Máme metody, jak se o výjimce SQL dozvědět konkrétněji.
Metody jsou getMessage (), getErrorCode (), getSQLState (), getNextException a printStackTace. getNextException se použije v případě Exception Chained.
Doporučené čtení
- Výjimky Java a zpracování výjimek s příklady
- Top 10 selenových výjimek a jak s nimi zacházet (přesný kód)
- Kompletní průvodce zpracováním výjimek PL SQL s příklady
- Výukový program pro zpracování výjimek C # s příklady kódu
- Zpracování výjimek v C ++
- Jak zpracovat výjimku v SoapUI Groovy skriptech - SoapUI Tutorial # 11
- Výukový program PL SQL pro začátečníky s příklady | Co je to PL / SQL
- Balíček PL SQL: Výukový program balíku Oracle PL / SQL s příklady