jdbc exception handling how handle sql exceptions
come chiedere la promozione nella valutazione delle prestazioni
Questo tutorial sulla gestione delle eccezioni JDBC spiega come gestire le eccezioni SQL con l'aiuto di esempi di programmazione:
Nel Gestione transazioni JDBC tutorial di Serie di tutorial JDBC , abbiamo appreso i tipi di transazione JDBC, i tipi di dati, i metodi di gestione delle transazioni e come utilizzarli nei programmi Java.
In questo tutorial, impareremo a conoscere le eccezioni in JDBC e come gestirle. In JDBC, se l'eccezione si è verificata a causa della connettività del database o di qualsiasi cosa correlata al DB, rientrerà in SQLException. Qui, vedremo ulteriori informazioni su SQLExceptions.
Prepariamoci a conoscere le eccezioni in JDBC.
Cosa imparerai:
Gestione delle eccezioni JDBC
Si verificano eccezioni quando si verifica un errore o un avviso nell'esecuzione del programma. Quando si verifica un'eccezione, il normale flusso del programma verrà disturbato e il programma verrà terminato in modo anomalo. La cosa buona dell'eccezione è che possiamo gestirla utilizzando un blocco try-catch o una parola chiave throws. Tutte le eccezioni e gli errori sono le sottoclassi della classe Throwable. La classe Throwable è la classe base di tutte le eccezioni e gli errori.
Parole chiave per la gestione delle eccezioni Java
Esistono cinque parole chiave nella gestione delle eccezioni Java. Sono i seguenti:
- Provare: Le istruzioni del programma che possono sollevare l'eccezione dovrebbero essere mantenute all'interno di un blocco try.
- Catturare: Se si verifica un'eccezione nel blocco try, verrà lanciata. Possiamo catturare quell'eccezione usando il blocco Catch e gestirla nel codice.
- Gettare: Le eccezioni generate dal sistema vengono lanciate automaticamente da JVM. Per generare manualmente le eccezioni, dovremmo usare una parola chiave throw.
- Lanci: Qualsiasi eccezione che è stata generata da un metodo dovrebbe essere specificata da una clausola throws.
- Infine: Qualsiasi istruzione di programma che deve essere eseguita dopo il blocco try dovrebbe essere mantenuta nel blocco finalmente.
>> Fare clic Qui per ulteriori informazioni sulle eccezioni in Java.
SQLException
In JDBC, potremmo ricevere eccezioni quando eseguiamo o creiamo la query. Le eccezioni che si verificano a causa del database o del driver rientrano nell'eccezione SQL. Utilizzando la gestione delle eccezioni, possiamo gestire l'eccezione SQL come gestiamo l'eccezione normale.
SQLException è disponibile nel pacchetto java.sql. Estende la classe Exception, il che significa che possiamo utilizzare i metodi disponibili nella classe Exception anche nella classe SQLException.
Esempio di eccezione SQL
Un errore di sintassi nell'istruzione SQL può causare un'eccezione SQL. Quando si verifica una tale eccezione, un oggetto della classe SQLException verrà passato al blocco catch. Utilizzando le informazioni nell'oggetto SQLException, possiamo rilevare l'eccezione e continuare il programma.
L'oggetto SQLException dispone dei seguenti metodi:
Nome metodo | Descrizione |
---|---|
getErrorCode () | Restituisce il numero di errore |
getMessage () | Restituisce il messaggio di errore |
getSQLState () | Restituisce lo SQLState dell'oggetto SQLException. Può anche restituire null. In caso di errore del database, restituirà lo stato SQL XOPEN |
getNextException () | Restituisce la prossima eccezione nella catena di eccezioni. |
printStackTrace () | Stampa l'eccezione corrente e il suo backtrace in un flusso di errore standard |
setNextException (SQLEXception ex) | Viene utilizzato per aggiungere un'altra eccezione SQL nella catena |
Come gestire le eccezioni
L'eccezione correlata a JDBC genera principalmente SQLException ed è un'eccezione controllata, quindi dobbiamo catturarla o lanciarla. Tutta la logica di business e i dati di commit dovrebbero essere eseguiti in un blocco Try, se si verifica un'eccezione nel blocco dovremmo catturarla e gestirla nel blocco Catch. In base al tipo di eccezione, dovremmo eseguire i rollback o il commit nel blocco Catch.
Categorie di SQLException
A volte il driver JDBC può generare la sottoclasse di SQLException che rappresenta uno stato SQL comune o uno stato di errore comune che non è specificamente associato a un particolare valore della classe dello stato SQL. Ti farà gestire l'eccezione in un modo più specifico e noi possiamo gestirla nel nostro codice. Questi tipi di eccezioni rientrano nelle sottoclassi di una delle seguenti eccezioni:
- SQLNonTransientException: Questo tipo di eccezione verrà generata quando un'istanza in cui un nuovo tentativo della stessa operazione non andrebbe a buon fine a meno che la causa dell'SQLException non sia stata corretta.
- SQLTransientException: Questo tipo di eccezione verrà generato quando un'operazione precedentemente fallita è in grado di avere successo quando abbiamo ritentato l'operazione senza alcuna modifica / intervento.
- SQLRecoverableException: Questo tipo di eccezione verrà generata quando un'operazione precedentemente non riuscita può avere successo quando si ritenta l'operazione con qualsiasi modifica / intervento da parte dell'applicazione. Mentre lo fai, la connessione corrente dovrebbe essere chiusa e la nuova connessione dovrebbe essere aperta.
Altre sottoclassi di SQLException:
Le seguenti sono le sottoclassi di SQLException:
- BatchUpdateException: Questo tipo di eccezione verrà generato se si è verificato un errore durante l'operazione di aggiornamento batch. Oltre alle informazioni SQLException, BatchUpdateException fornisce lo stato delle istruzioni che sono state eseguite / aggiornate prima che si verificasse l'errore.
- SQLClientInfoException: Questo tipo di eccezione verrà generata se una o più proprietà delle informazioni non possono essere impostate su una connessione. Oltre alle informazioni SQLException, SQLClientInfoException un elenco di proprietà delle informazioni client che non sono state impostate.
In questo tutorial, vedremo la normale SQLException, quindi vedremo BatchUpdateException. È possibile esercitare le restanti sottoclassi di SQLException sul proprio sistema.
Nell'esempio seguente, elaboreremo come gestire l'eccezione.
Tutti i programmi sono scritti in Java, in questo tutorial. Abbiamo utilizzato la versione Java 8 e Oracle DB.
>> Fare clic Qui per scaricare il software Oracle
>> Fare clic Qui per scaricare la versione 8 di Java
Ha il processo di installazione Java passo passo.
Programma di esempio di eccezioni
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(); } } }
Produzione:
Spiegazione:
# 1) Creata una query di selezione che ha il nome della colonna che non è nella tabella EMPLOYEE_DETAILS.
Crea query:
String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011';
#Due) Creato connessione, istruzione ed eseguito la QUERY di selezione nel blocco try.
# 3) Nel blocco Catch, abbiamo gestito l'eccezione.
# 4) Stiamo visualizzando l'errore dell'eccezione utilizzando il metodo getError (), SQLState dell'eccezione utilizzando il metodo getSQLState (), il messaggio dell'eccezione utilizzando il metodo getMessage () e stampando la traccia dello stack dell'eccezione utilizzando il metodo printStackTrace.
BatchUpdateException Esempio
Abbiamo creato una nuova tabella per illustrare l'esempio di BatchUpdateException. Il nome della tabella è EMPLOYEE. Ha 3 colonne.
Sono:
- ID che è una chiave primaria
- COGNOME
- NOME DI BATTESIMO
Sintassi per creare una tabella in ORACLE DB:
CREATE TABLE EMPLOYEE ( ID int NOT NULL PRIMARY KEY, LastName varchar(255), FirstName varchar(255) );
Programma 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(); } } }
PRODUZIONE:
Spiegazione:
Quello che abbiamo fatto nel programma sopra è che abbiamo creato 3 query INSERT e le abbiamo aggiunte in un batch e le abbiamo eseguite. Il 3rdla query ha lo stesso valore ID di 1stpoiché la colonna ID è una chiave primaria della tabella EMPLOYEE, il programma ha generato una BatchUpdateException.
- Creato le 3 query di inserimento per inserirlo nella tabella EMPLOYEE. La prima e la terza query hanno lo stesso valore ID. La colonna id è una chiave primaria per la tabella EMPLOYEE.
- Creato oggetto istruzione e aggiunto queste 3 query utilizzando il metodo addBatch (). Quindi chiama il metodo executeBatch () per eseguirlo.
- Poiché la prima e la terza query hanno lo stesso valore ID. Quando executeBatch () ha tentato di eseguire la terza query, genererà BatchUpdateException.
- Nel blocco catch BatchUpdateException, abbiamo chiamato il metodo getUpdateCounts () per ottenere lo stato della riga aggiornata.
- Usando il ciclo for, stiamo controllando uno per uno se lo stato di una particolare istruzione viene eseguito fallito o meno. Se la particolare istruzione non fallisce, stamperà il numero di riga dell'istruzione.
- Successivamente, stamperà il printStackTrace di BatchUpdateException.
- Nell'esempio precedente, poiché l'eccezione si è verificata a causa della terza istruzione, le istruzioni 1 e 2 sono state stampate. Quindi la traccia completa dell'eccezione è stata stampata nella console di output.
Punti da ricordare:
- L'eccezione che si è verificata a causa del database rientrerà in SQLException.
- Le eccezioni in Java possono essere gestite utilizzando il blocco try: catch.
- SQLException è l'eccezione selezionata, quindi possiamo gestirla utilizzando try: catch block.
- Abbiamo alcune sottoclassi di SQLException. Sono SQLNonTransientException, SQLTransientException, SQLRecoverableException, BatchUpdateException e SQLClientInfoException.
Domande frequenti
D # 1) Che cos'è un'eccezione SQL?
Risposta: Si è verificata un'eccezione perché il database è noto come eccezione SQL. Un'eccezione che fornisce informazioni sul database correlato è nota anche come eccezione SQL. Abbiamo una classe SQLException in Java, che viene utilizzata per fornire informazioni sull'eccezione. Ha i seguenti metodi:
- getErrorCode ()
- getMessage ()
- getSQLState ()
- printStackTrace ()
- getNextException ()
Q # 2) Come gestire l'eccezione in SQL?
Risposta: Scrivi la logica aziendale nel blocco try. Se si è verificato un errore o un'eccezione, intercettalo nel blocco Catch e scrivi il messaggio appropriato per trovare facilmente l'eccezione.
Il blocco Try-Catch viene utilizzato per gestire l'eccezione.
D # 3) Quando può verificarsi SQLException in Java?
Risposta: SQLException si verifica se si verifica un errore nell'accesso al database o altri errori relativi al database. Quando si verifica SQLException, un oggetto di tipo SQLException verrà passato alla clausola catch. Possiamo gestirlo nel blocco Catch.
D # 4) Cos'è la catena delle eccezioni in Java e a cosa serve?
Risposta: Un'eccezione che causa un'altra eccezione è nota come catena di eccezioni o eccezione concatenata. Nella maggior parte dei casi abbiamo bisogno di concatenare l'eccezione in modo tale da mettere in relazione un'eccezione con un'altra eccezione, renderà i log chiari e facili da tracciare. Sarà utile per il programmatore nel processo di debug.
Per esempio:
Considera un metodo che genera un'eccezione aritmetica dovuta alla divisione per zero. La causa effettiva dell'eccezione è un errore di I / O, che fa sì che il divisore sia zero. Il metodo genererà solo un'eccezione aritmetica al programmatore. In modo che il chiamante / programmatore non venga a conoscenza della causa effettiva dell'eccezione. In questo tipo di situazione, possiamo utilizzare un'eccezione concatenata.
Conclusione
Le eccezioni possono essere gestite utilizzando un blocco try-catch o lanciandolo. Si sono verificate eccezioni perché il database è noto come SQLException. Abbiamo una classe separata per SQLException che è una sottoclasse di Exception. Abbiamo i metodi per conoscere l'eccezione SQL in modo più specifico.
I metodi sono getMessage (), getErrorCode (), getSQLState (), getNextException e printStackTace. getNextException verrà utilizzato nel caso Exception Chained.
Lettura consigliata
- Eccezioni Java e gestione delle eccezioni con esempi
- Le 10 migliori eccezioni al selenio e come gestirle (codice esatto)
- Guida completa alla gestione delle eccezioni PL SQL con esempi
- Esercitazione sulla gestione delle eccezioni C # con esempi di codice
- Gestione delle eccezioni in C ++
- Come gestire le eccezioni negli script Groovy SoapUI - Tutorial SoapUI # 11
- Tutorial PL SQL per principianti con esempi | Cos'è PL / SQL
- Pacchetto PL SQL: Tutorial pacchetto Oracle PL / SQL con esempi