JDBC - Gestione delle eccezioni

La gestione delle eccezioni consente di gestire condizioni eccezionali come gli errori definiti dal programma in modo controllato.

Quando si verifica una condizione di eccezione, viene generata un'eccezione. Il termine generato indica che l'esecuzione del programma corrente si interrompe e il controllo viene reindirizzato alla clausola catch applicabile più vicina. Se non esiste alcuna clausola catch applicabile, l'esecuzione del programma termina.

La gestione delle eccezioni JDBC è molto simile alla gestione delle eccezioni Java, ma per JDBC, l'eccezione più comune che dovrai affrontare è java.sql.SQLException.

Metodi SQLException

Una SQLException può verificarsi sia nel driver che nel database. Quando si verifica una tale eccezione, un oggetto di tipo SQLException verrà passato alla clausola catch.

L'oggetto SQLException passato ha i seguenti metodi disponibili per recuperare informazioni aggiuntive sull'eccezione:

Metodo Descrizione
getErrorCode () Ottiene il numero di errore associato all'eccezione.
getMessage () Ottiene il messaggio di errore del driver JDBC per un errore, gestito dal driver o ottiene il numero di errore Oracle e il messaggio per un errore del database.
getSQLState () Ottiene la stringa XOPEN SQLstate. Per un errore del driver JDBC, non vengono restituite informazioni utili da questo metodo. Per un errore del database, viene restituito il codice XOPEN SQLstate a cinque cifre. Questo metodo può restituire null.
getNextException () Ottiene il successivo oggetto Exception nella catena di eccezioni.
printStackTrace () Stampa l'eccezione corrente, o lanciabile, ed è backtrace in un flusso di errore standard.
printStackTrace (PrintStream s) Stampa questo oggetto lanciabile e il suo backtrace nel flusso di stampa specificato.
printStackTrace (PrintWriter w) Stampa questo oggetto lanciabile e torna indietro al programma di scrittura specificato.

Utilizzando le informazioni disponibili dall'oggetto Eccezione, è possibile rilevare un'eccezione e continuare il programma in modo appropriato. Ecco la forma generale di un blocco di prova:

try {
   // Your risky code goes between these curly braces!!!
}
catch(Exception ex) {
   // Your exception handling code goes between these 
   // curly braces, similar to the exception clause 
   // in a PL/SQL block.
}
finally {
   // Your must-always-be-executed code goes between these 
   // curly braces. Like closing database connection.
}

Esempio

Studia il seguente codice di esempio per comprendere l'utilizzo di try....catch...finally blocchi.

//STEP 1. Import required packages
import java.sql.*;

public class JDBCExample {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/EMP";

   //  Database credentials
   static final String USER = "username";
   static final String PASS = "password";
   
   public static void main(String[] args) {
   Connection conn = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);

      //STEP 4: Execute a query
      System.out.println("Creating statement...");
      Statement stmt = conn.createStatement();
      String sql;
      sql = "SELECT id, first, last, age FROM Employees";
      ResultSet rs = stmt.executeQuery(sql);

      //STEP 5: Extract data from result set
      while(rs.next()){
         //Retrieve by column name
         int id  = rs.getInt("id");
         int age = rs.getInt("age");
         String first = rs.getString("first");
         String last = rs.getString("last");

         //Display values
         System.out.print("ID: " + id);
         System.out.print(", Age: " + age);
         System.out.print(", First: " + first);
         System.out.println(", Last: " + last);
      }
      //STEP 6: Clean-up environment
      rs.close();
      stmt.close();
      conn.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye!");
}//end main
}//end JDBCExample

Ora, compiliamo l'esempio sopra come segue:

C:\>javac JDBCExample.java
C:\>

Quando corri JDBCExample, produce il seguente risultato se non ci sono problemi, altrimenti l'errore corrispondente verrebbe rilevato e verrebbe visualizzato il messaggio di errore -

C:\>java JDBCExample
Connecting to database...
Creating statement...
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
C:\>

Prova l'esempio precedente passando un nome database errato o un nome utente o una password errati e controlla il risultato.