jdbc exception handling how handle sql exceptions
una aplicació per espiar un altre telèfon
Aquest tutorial de Gestió d'excepcions de JDBC explica maneres de gestionar excepcions SQL amb l'ajut d'exemples de programació:
A la Gestió de transaccions JDBC tutorial del Sèrie de tutorials JDBC , vam aprendre tipus de transaccions JDBC, tipus de dades, mètodes de gestió de transaccions i com utilitzar-los en programes Java.
En aquest tutorial, aprendrem sobre les excepcions a JDBC i com gestionar-les. A JDBC, si l'excepció es produeix a causa de la connectivitat a la base de dades o qualsevol cosa relacionada amb la base de dades, passarà a SQLException. Aquí veurem més informació sobre SQLExceptions.
Preparem-nos per obtenir informació sobre les excepcions a JDBC.
Què aprendreu:
Gestió d'excepcions JDBC
Hi ha excepcions quan hi ha un error o advertència en l'execució del programa. Quan es produeix una excepció, el flux normal del programa es pertorbarà i el programa es tancarà de manera anormal. El millor de l'excepció és que podem gestionar-la mitjançant un bloc de prova o una paraula clau. Totes les excepcions i errors són les subclasses de la classe Throwable. La classe llançable és la classe base de totes les excepcions i errors.
Paraules clau de gestió d’excepcions de Java
Hi ha cinc paraules clau a Java Exception Handling. Són els següents:
- Proveu: Les declaracions del programa que poden generar l'excepció s'han de conservar dins d'un bloc de prova.
- Captura: Si es produeix alguna excepció al bloc try, es llançarà. Podem detectar aquesta excepció mitjançant el bloc Catch i gestionar-la al codi.
- Llançar: JVM genera automàticament les excepcions generades pel sistema. Per llançar manualment les excepcions, hauríem d’utilitzar un llançament de paraules clau.
- Llançaments: Qualsevol excepció que s'hagi eliminat d'un mètode s'hauria d'especificar mitjançant una clàusula throws.
- Finalment: Qualsevol declaració de programa que s'hagi d'executar després del bloc try s'ha de conservar al bloc final.
>> Feu clic a aquí per obtenir més informació sobre excepcions a Java.
SQLException
A JDBC, podem obtenir excepcions quan executem o creem la consulta. Les excepcions que es produeixen a causa de la base de dades o el controlador es troben a SQL Exception. Mitjançant el maneig d’excepcions, podem gestionar l’excepció SQL com gestionem l’excepció normal.
SQLException està disponible al paquet java.sql. Amplia la classe Exception, cosa que significa que també podem utilitzar els mètodes disponibles a la classe Exception a la classe SQLException.
Exemple d'excepció SQL
Un error de sintaxi a la sentència SQL pot provocar una excepció SQL. Quan es produeix aquesta excepció, un objecte de la classe SQLException es passarà al bloc de captura. En utilitzar la informació de l’objecte SQLException, podem obtenir aquesta excepció i continuar el programa.
L'objecte SQLException té els mètodes següents:
Nom del mètode | Descripció |
---|---|
getErrorCode () | Torna el número d'error |
getMessage () | Torna el missatge d'error |
getSQLState () | Torna el SQLState de l'objecte SQLException. També pot tornar nul. Per error de base de dades, tornarà XOPEN SQL State |
getNextException () | Retorna la següent excepció de la cadena d'excepcions. |
printStackTrace () | Imprimeix l'excepció actual i la seva traça posterior a un flux d'errors estàndard |
setNextException (SQLEXception ex) | S'utilitza per afegir una altra excepció SQL a la cadena |
Com gestionar les excepcions
L'excepció relacionada amb JDBC llança principalment SQLException i és una excepció comprovada, de manera que hem de capturar-la o llançar-la. Tota la lògica empresarial i les dades de confirmació s’haurien de fer en un bloc Try, si hi hagués alguna excepció al bloc, hauríem de capturar-la i gestionar-la al bloc Catch. Basant-nos en el tipus d’excepció, hauríem de fer els rollbacks o commit al bloc Catch.
Categories d'excepció SQLE
De vegades, el controlador JDBC pot generar la subclasse de SQLException que representa un estat SQL comú o un estat d’error comú que no s’associa específicament a un valor de classe d’estat SQL concret. Us farà gestionar l'excepció d'una manera més específica i la podem gestionar al nostre codi. Aquest tipus d’excepcions pertanyen a les subclasses d’una de les excepcions següents:
- SQLNonTransientException: Aquest tipus d’excepció es generarà quan es produeixi un error en què es produeixi un altre intent de la mateixa operació tret que s’hagi corregit la causa de l’excepció SQLException.
- SQLTransientException: Aquest tipus d’excepció es generarà quan una operació fallida anteriorment pugui tenir èxit quan tornem a provar l’operació sense cap canvi / intervenció.
- SQLRecoverableException: Aquest tipus d'excepció es generarà quan una operació fallida anteriorment tingui èxit quan tornem a provar l'operació amb qualsevol canvi / intervenció de l'aplicació. En fer-ho, s'hauria de tancar la connexió actual i obrir la nova connexió.
Altres subclasses de SQLException:
A continuació es mostren les subclasses de SQLException:
- BatchUpdateException: Aquest tipus d'excepció es generarà si s'ha produït algun error en fer l'operació d'actualització per lots. A més de la informació SQLException, BatchUpdateException proporciona l'estat de les sentències que s'han executat / actualitzat abans que es produeixi l'error.
- SQLClientInfoException: Aquest tipus d'excepció es generarà si no es pot establir una o més propietats d'informació en una connexió. A més de la informació SQLException, SQLClientInfoException inclou una llista de propietats d'informació del client que no s'han definit.
En aquest tutorial, veurem SQLException normal i, a continuació, veurem BatchUpdateException. Podeu exercir la resta de subclasses de SQLException al vostre sistema.
A l'exemple següent, detallarem com gestionar l'excepció.
Tots els programes estan escrits en Java, en aquest tutorial. Hem utilitzat la versió Java 8 i Oracle DB.
>> Feu clic a aquí per descarregar el programari Oracle
>> Feu clic a aquí per descarregar la versió 8 de Java
Té el procés d’instal·lació de Java pas a pas.
Exemple de programa d’excepcions
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(); } } }
Sortida:
Explicació:
# 1) S'ha creat una consulta selectiva que té el nom de la columna que no es troba a la taula EMPLOYEE_DETAILS.
Crea una consulta:
String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011';
# 2) S'ha creat la connexió, la declaració i s'ha executat la selecció QUERY al bloc try.
# 3) Al bloc Catch, hem gestionat l'excepció.
# 4) Mostrem l'error de l'excepció mitjançant el mètode getError (), SQLState de l'excepció amb el mètode getSQLState (), el missatge de l'excepció mitjançant el mètode getMessage () i imprimim la traça de pila de l'excepció mitjançant el mètode printStackTrace.
Exemple de BatchUpdateException
Hem creat una taula nova per il·lustrar l’exemple de BatchUpdateException. El nom de la taula és EMPLOYEE. Té 3 columnes.
Ells són:
- Identificador que és una clau principal
- COGNOM
- NOM
Sintaxi per crear una taula a ORACLE DB:
CREATE TABLE EMPLOYEE ( ID int NOT NULL PRIMARY KEY, LastName varchar(255), FirstName varchar(255) );
Programa 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(); } } }
SORTIDA:
Explicació:
El que hem fet al programa anterior és que hem creat 3 consultes INSERT i les hem afegit en un lot i les hem executat. El 3rdla consulta té el mateix valor d'identificador d'1cconsulta ja que la columna ID és la clau principal de la taula EMPLOYEE, el programa ha generat una excepció BatchUpdateException.
- S'han creat les 3 consultes d'inserció per inserir-la a la taula EMPLOYEE. La primera i la tercera consulta tenen el mateix valor d'identificador. La columna id és la clau principal de la taula EMPLOYEE.
- S'ha creat l'objecte de declaració i hi ha afegit aquestes 3 consultes mitjançant el mètode addBatch (). Després es diu mètode executeBatch () per executar-lo.
- Atès que la primera i la tercera consulta tenen el mateix valor d'identificador. Quan executeBatch () ha intentat executar la tercera consulta, llançarà BatchUpdateException.
- Al bloc de captura BatchUpdateException, hem anomenat el mètode getUpdateCounts () per obtenir l’estat de la fila actualitzada.
- Utilitzant el bucle, comprovem un per un si l'estat de la sentència en concret s'executa ha fallat o no. Si la declaració particular no falla, s'imprimirà el número de fila de la declaració.
- Després, s'imprimirà printStackTrace de l'excepció BatchUpdateException.
- A l'exemple anterior, atès que l'excepció s'ha produït a causa de la tercera sentència, de manera que s'han imprès les sentències 1 i 2. A continuació, la traça completa de l'excepció s'ha imprès a la consola de sortida.
Punts que cal recordar:
- L'excepció que es va produir a causa de la base de dades passarà a SQLException.
- Les excepcions a Java es poden gestionar mitjançant el bloc try: catch.
- SQLException és l'excepció marcada, de manera que podem gestionar-la mitjançant el bloc try: catch.
- Tenim algunes subclasses de SQLException. Són SQLNonTransientException, SQLTransientException, SQLRecoverableException, BatchUpdateException i SQLClientInfoException.
Preguntes freqüents
P # 1) Què és una excepció SQL?
Resposta: Es va produir una excepció perquè la base de dades es coneix com SQL Exception. Una excepció que proporciona informació sobre bases de dades també es coneix com SQL Exception. Tenim una classe SQLException a Java, que s’utilitza per proporcionar informació sobre l’excepció. Té els mètodes següents:
- getErrorCode ()
- getMessage ()
- getSQLState ()
- printStackTrace ()
- getNextException ()
Q # 2) Com gestionar l'excepció a SQL?
Resposta: Escriviu la lògica empresarial al bloc try. Si hi ha hagut algun error o excepció, agafeu-lo al bloc Captura i escriviu el missatge adequat per trobar l'excepció fàcilment.
El bloc Try-Catch s’utilitza per gestionar l’excepció.
P # 3) Quan es pot produir SQLException a Java?
Resposta: SQLException es produeix si hi ha un error en l'accés a la base de dades o altres errors relacionats amb la base de dades. Quan es produeix SQLException, un objecte de tipus SQLException es passarà a la clàusula catch. El podem gestionar al bloc Catch.
Q # 4) Què és la cadena Exception a Java i per a què serveix?
Resposta: Una excepció que causa una altra excepció es coneix com a cadena d’excepcions o excepció encadenada. En la majoria dels casos, necessitem encadenar les excepcions de manera que relacionin una excepció amb una altra excepció, farà que els registres siguin clars i fàcils de fer un seguiment. Serà útil per al programador en el procés de depuració.
Per exemple:
Penseu en un mètode que genera una excepció aritmètica deguda a la divisió per zero. La causa real de l'excepció és un error d'E / S, que fa que el divisor sigui zero. El mètode només generarà una excepció aritmètica al programador. De manera que la persona que truca / programador no coneixerà la causa real de l'excepció. En aquest tipus de situacions, podem utilitzar una excepció encadenada.
Conclusió
Les excepcions es poden gestionar mitjançant un bloc de prova o llançant-lo. Les excepcions produïdes a causa de la base de dades es coneixen com SQLException. Tenim una classe independent per a SQLException, que és una subclase d'Exception. Tenim els mètodes per conèixer l’excepció SQL de manera més específica.
Els mètodes són getMessage (), getErrorCode (), getSQLState (), getNextException i printStackTace. getNextException s’utilitzarà en el cas de la cadena d’excepcions.
Lectura recomanada
- Excepcions de Java i tractament d’excepcions amb exemples
- Top 10 excepcions de seleni i com gestionar-les (codi exacte)
- Guia completa del maneig d'excepcions de PL SQL amb exemples
- Tutorial de maneig d'excepcions C # amb exemples de codi
- Gestió d'excepcions a C ++
- Com gestionar l'excepció en scripts SoapUI Groovy - Tutorial SoapUI núm. 11
- Tutorial PL SQL per a principiants amb exemples | Què és PL / SQL
- Paquet PL SQL: tutorial del paquet PL / SQL d'Oracle amb exemples