jdbc exception handling how handle sql exceptions
wow hvilken server man skal spille på
Denne JDBC-undtagelseshåndteringsvejledning forklarer måder at håndtere SQL-undtagelser ved hjælp af programmeringseksempler på:
I JDBC-transaktionsstyring tutorial af JDBC tutorial-serie , vi lærte JDBC-transaktionstyper, datatyper, transaktionsstyringsmetoder og hvordan man bruger dem i Java-programmer.
I denne vejledning lærer vi om undtagelser i JDBC og hvordan man håndterer dem. I JDBC, hvis undtagelsen opstod på grund af databaseforbindelse eller noget, der er relateret til DB, kommer den under SQLException. Her vil vi se mere information om SQLExceptions.
Lad os gøre os klar til at lære om undtagelser i JDBC.
Hvad du lærer:
JDBC undtagelseshåndtering
Undtagelser opstår, når der er en fejl eller advarsel i udførelsen af programmet. Når en undtagelse opstår, forstyrres programmets normale flow, og programmet afsluttes unormalt. Den gode ting ved undtagelsen er, at vi kan håndtere det ved hjælp af en try-catch-blok eller kaster nøgleord. Alle undtagelser og fejl er underklasser i klasse Throwable. Kastbar klasse er basisklassen for alle undtagelser og fejl.
Java Exception Håndtering af nøgleord
Der er fem nøgleord i Java Exception Handling. De er som følger:
- Prøve: Programerklæringer, der kan hæve undtagelsen, skal holdes inden for en prøveblok.
- Fangst: Hvis der opstår en undtagelse i prøveblokken, kastes den. Vi kan fange denne undtagelse ved hjælp af fangstblokken og håndtere den i koden.
- Kaste: Systemgenererede undtagelser kastes automatisk af JVM. For manuelt at kaste undtagelserne skal vi bruge et nøgleordskast.
- Kaster: Enhver undtagelse, der er blevet kastet ud af en metode, bør specificeres af en kasteklausul.
- Langt om længe: Eventuelle programerklæringer, der skal udføres efter prøveblokken, skal opbevares i den endelige blok.
>> Klik her for mere information om undtagelser i Java.
SQLE undtagelse
I JDBC kan vi få undtagelser, når vi udfører eller opretter forespørgslen. Undtagelser, der opstår på grund af databasen eller driveren, hører under SQL-undtagelse. Ved hjælp af undtagelseshåndtering kan vi håndtere SQL-undtagelsen, som vi håndterer den normale undtagelse.
SQLException er tilgængelig i java.sql-pakken. Det udvider Exception-klassen, hvilket betyder, at vi også kan bruge de tilgængelige metoder i Exception-klassen i SQLException-klassen.
Eksempel på SQL-undtagelse
Syntaksfejl i SQL-sætningen kan resultere i SQL-undtagelse. Når en sådan undtagelse opstår, sendes et objekt fra SQLException-klassen til fangstblokken. Ved at bruge oplysningerne i SQLException-objektet kan vi fange denne undtagelse og fortsætte programmet.
SQLException-objektet har følgende metoder:
Metodenavn | Beskrivelse |
---|---|
getErrorCode () | Det returnerer fejlnummeret |
getMessage () | Det returnerer fejlmeddelelsen |
getSQLState () | Det returnerer SQLState for SQLException-objektet. Det kan også returnere null. For databasefejl returnerer den XOPEN SQL-tilstand |
getNextException () | Den returnerer den næste undtagelse i undtagelseskæden. |
printStackTrace () | Den udskriver den aktuelle undtagelse og dens tilbagesporing til en standardfejlstrøm |
setNextException (SQLEXception ex) | Det bruges til at tilføje en anden SQL-undtagelse i kæden |
Sådan håndteres undtagelser
JDBC-relateret undtagelse kaster for det meste SQLException, og det er en kontrolleret undtagelse, så vi skal enten fange den eller kaste den. Al forretningslogik og forpligtelsesdata skal udføres i en prøveblok. Hvis der skete en undtagelse i blokken, skal vi fange og håndtere det i fangstblokken. Baseret på undtagelsestypen skal vi udføre tilbageførsler eller begå i Catch-blokken.
Kategorier af SQLException
Nogle gange kan JDBC-driveren muligvis kaste underklassen af SQLException, der repræsenterer en fælles SQL-tilstand eller en fælles fejltilstand, der specifikt ikke er forbundet med en bestemt SQL-statusklasseværdi. Det får dig til at håndtere undtagelsen på en mere specifik måde, og vi kan håndtere den i vores kode. Disse typer undtagelser hører under underklassen til en af følgende undtagelser:
- SQLNonTransientException: Denne type undtagelse kastes, når en forekomst, hvor et forsøg på samme handling mislykkedes, medmindre årsagen til SQLException er blevet rettet.
- SQLTransientException: Denne type undtagelse kastes, når en tidligere mislykket operation er i stand til at lykkes, når vi igen forsøgte operationen uden nogen ændring / intervention.
- SQLRecoverableException: Denne type undtagelse kastes, når en tidligere mislykket operation kan lykkes, når vi forsøgte operationen igen med enhver ændring / intervention fra applikationen. Mens du gør det, skal den aktuelle forbindelse lukkes, og den nye forbindelse skal åbnes.
Andre underklasser af SQLException:
Følgende er underklasser af SQLException:
- BatchUpdateException: Denne type undtagelse kastes, hvis der er opstået en fejl under batchopdateringsoperationen. Udover SQLException-oplysningerne giver BatchUpdateException status for de udsagn, der er blevet udført / opdateret inden fejlen opstod.
- SQLClientInfoException: Denne type undtagelse kastes, hvis en eller flere informationsegenskaber ikke kunne indstilles på en forbindelse. Udover SQLException-oplysningerne er SQLClientInfoException en liste over klientinformationsegenskaber, der ikke blev indstillet.
I denne vejledning vil vi se normal SQLException, og så vil vi se BatchUpdateException. Du kan udøve de resterende underklasser af SQLException på dit system.
I det følgende eksempel vil vi uddybe, hvordan undtagelsen skal håndteres.
Alle programmer er skrevet i Java i denne vejledning. Vi har brugt Java 8-versionen og Oracle DB.
>> Klik her for at downloade Oracle-softwaren
>> Klik her for at downloade Java version 8
Det har den trinvise Java-installationsproces.
Undtagelseseksempelprogram
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(); } } }
Produktion:
Forklaring:
# 1) Oprettet en valgforespørgsel, der har kolonnenavnet, der ikke er i tabellen EMPLOYEE_DETAILS.
Opret forespørgsel:
String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011';
#to) Oprettet forbindelse, erklæring og udførte markeringen QUERY i prøveblokken.
# 3) I fangstblokken håndterede vi undtagelsen.
# 4) Vi viser fejlen i undtagelsen ved hjælp af getError () -metoden, SQLState i undtagelsen ved hjælp af getSQLState () -metoden, meddelelsen om undtagelsen ved hjælp af getMessage () -metoden og udskriver stakksporingen af undtagelsen ved hjælp af printStackTrace-metoden.
Eksempel på BatchUpdateException
Vi har oprettet en ny tabel for at illustrere eksemplet BatchUpdateException. Tabellens navn er MEDARBEJDERE. Den har 3 kolonner.
De er:
- ID, som er en primær nøgle
- EFTERNAVN
- FORNAVN
Syntaks for at oprette en tabel i ORACLE DB:
CREATE TABLE EMPLOYEE ( ID int NOT NULL PRIMARY KEY, LastName varchar(255), FirstName varchar(255) );
Java-program:
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(); } } }
PRODUKTION:
Forklaring:
Hvad vi har gjort i ovenstående program er, at vi har oprettet 3 INSERT-forespørgsler og tilføjet det i en batch og udført det. Den 3rdforespørgsel har den samme id-værdi på 1St.forespørgsel, da ID-kolonnen er en primær nøgle i tabellen EMPLOYEE, har programmet kastet en BatchUpdateException.
- Oprettede de 3 indsæt forespørgsler for at indsætte det i tabellen MEDARBEJDERE. Den første og tredje forespørgsel har den samme ID-værdi. Id-kolonnen er en primær nøgle til tabellen MEDARBEJDERE.
- Oprettet sætningsobjekt og tilføjede disse 3 forespørgsler til det ved hjælp af metoden addBatch (). Derefter kaldes executeBatch () metode til at udføre den.
- Siden den første og tredje forespørgsel har den samme ID-værdi. Når executeBatch () forsøgte at udføre den tredje forespørgsel, vil den kaste BatchUpdateException.
- I fangstblokken BatchUpdateException kaldte vi metoden getUpdateCounts () for at få status for den opdaterede række.
- Ved hjælp af for loop kontrollerer vi en efter en, om status for den bestemte erklæring udføres mislykkedes eller ej. Hvis den specifikke erklæring ikke mislykkes, udskriver den erklæringens række nummer.
- Derefter udskriver den printStackTrace af BatchUpdateException.
- I ovenstående eksempel, da undtagelsen opstod på grund af den tredje erklæring, er udsagnet 1 og 2 blevet udskrevet. Derefter er det fulde spor af undtagelsen blevet udskrevet i outputkonsollen.
Punkter at huske:
- Undtagelsen, der opstod på grund af databasen, kommer under SQLException.
- Undtagelser i Java kan håndteres ved hjælp af prøveblok.
- SQLException er den markerede undtagelse, så vi kan håndtere det ved hjælp af try: catch block.
- Vi har nogle underklasser af SQLException. De er SQLNonTransientException, SQLTransientException, SQLRecoverableException, BatchUpdateException og SQLClientInfoException.
Ofte stillede spørgsmål
Q # 1) Hvad er en SQL-undtagelse?
Svar: En undtagelse opstod på grund af database kaldes SQL Exception. En undtagelse, der giver information om databaserelateret, er også kendt som SQL Exception. Vi har en SQLException-klasse i Java, som bruges til at give information om undtagelsen. Det har følgende metoder:
- getErrorCode ()
- getMessage ()
- getSQLState ()
- printStackTrace ()
- getNextException ()
Q # 2) Hvordan håndteres undtagelsen i SQL?
Svar: Skriv forretningslogikken i prøveblokken. Hvis der er opstået en fejl eller undtagelse, skal du fange den i fangstblokken og skrive den relevante meddelelse for let at finde undtagelsen.
Try – Catch-blok bruges til at håndtere undtagelsen.
Q # 3) Når SQLException kan forekomme i Java?
Svar: SQLException opstår, hvis der er en fejl i databaseadgangen eller andre fejl relateret til databasen. Når SQLException opstår, overføres et objekt af typen SQLException til fangstklausulen. Vi kan klare det i fangstblokken.
Spørgsmål nr. 4) Hvad er Exception-kæden i Java, og hvad er brugen af den?
Svar: En undtagelse, der forårsager en anden undtagelse, er kendt som undtagelseskæde eller lænket undtagelse. I de fleste tilfælde er vi nødt til at kæde undtagelsen sådan, at der er en undtagelse med en anden undtagelse, det vil gøre logfilerne klare og nemme at spore. Det vil være nyttigt for programmøren i fejlfindingsprocessen.
For eksempel:
Overvej en metode, der kaster en aritmetisk undtagelse på grund af at dividere med nul. Den faktiske årsag til undtagelsen er en I / O-fejl, som gør skillelinjen nul. Metoden kaster kun en aritmetisk undtagelse til programmøren. Så den opkalder / programmør ikke kommer til at vide om den faktiske årsag til undtagelsen. I denne type situation kan vi bruge en lænket undtagelse.
Konklusion
Undtagelser kan håndteres ved hjælp af en prøvefangstblok eller ved at smide den. Undtagelser opstod på grund af databasen er kendt som SQLException. Vi har en separat klasse til SQLException, som er en underklasse af Undtagelse. Vi har metoderne til at lære SQL-undtagelsen at kende mere specifikt.
Metoderne er getMessage (), getErrorCode (), getSQLState (), getNextException og printStackTace. getNextException vil blive brugt i tilfælde af undtagelse lænket.
Anbefalet læsning
- Java-undtagelser og undtagelseshåndtering med eksempler
- Top 10 selenundtagelser og hvordan man håndterer disse (nøjagtig kode)
- Komplet guide til PL SQL undtagelseshåndtering med eksempler
- C # Exception Handling Tutorial med kodeeksempler
- Undtagelseshåndtering i C ++
- Sådan håndteres undtagelser i SoapUI Groovy Scripts - SoapUI Tutorial # 11
- PL SQL-vejledning til begyndere med eksempler Hvad er PL / SQL
- PL SQL-pakke: Oracle PL / SQL-pakkevejledning med eksempler