JDBC異常


例外處理允許我們以受控的方式處理異常情況,而不是直接退出程式,例如程式定義的錯誤。

發生異常時可以丟擲異常。術語「異常」表示當前的程式執行停止,並且被重定向到最近的適用的catch子句。如果沒有適用的catch子句存在,則程式的執行結束。

JDBC例外處理與Java例外處理非常相似,但對於JDBC,要處理的最常見異常是java.sql.SQLException

SQLException方法

驅動程式和資料庫中都會發生SQLException。 發生這種異常時,SQLException型別的物件將被傳遞給catch子句。

傳遞的SQLException物件具有以下可用於檢索有關異常資訊的方法 -

方法 描述
getErrorCode( ) 獲取與異常關聯的錯誤程式碼。
getMessage( ) 獲取驅動程式處理的錯誤的JDBC驅動程式的錯誤訊息,或獲取資料庫錯誤的Oracle錯誤程式碼和訊息。
getSQLState( ) 獲取XOPEN SQLstate字串。 對於JDBC驅動程式錯誤,不會從此方法返回有用的資訊。 對於資料庫錯誤,返回五位數的XOPEN SQLstate程式碼。 此方法可以返回null
getNextException( ) 獲取異常鏈中的下一個Exception物件。
printStackTrace( ) 列印當前異常或可丟擲的異常,並將其追溯到標準錯誤流。
printStackTrace(PrintStream s) 將此throwable及其回溯列印到指定的列印流。
printStackTrace(PrintWriter w) 列印這個throwable,它是回溯到指定的列印器(PrintWriter)。

通過利用Exception物件提供的資訊,可以捕獲異常並適當地繼續執行程式。下面是一個try塊的一般形式 -

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.
}

範例

學習研究以下範例程式碼以了解try …. catch … finally塊的用法。將下面程式碼儲存到檔案:TryCatchFinally.java 中,

//STEP 1. Import required packages
// See more detail at /20/213/8320.html


import java.sql.*;

public class TryCatchFinally {
   // 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 = "root";
   static final String PASS = "123456";

   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

現在編譯上面例子中程式碼如下 -

F:\worksp\jdbc>javac -Djava.ext.dirs=F:\worksp\jdbc\libs TryCatchFinally.java

執行上面編譯後的程式碼,得到以下結果 -

F:\worksp\jdbc>java -Djava.ext.dirs=F:\worksp\jdbc\libs TryCatchFinally
Connecting to database...
Thu Jun 01 02:59:01 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Creating statement...
ID: 100, Age: 28, First: Max, Last: Su
ID: 101, Age: 25, First: Wei, Last: Wang
ID: 102, Age: 35, First: Xueyou, Last: Zhang
ID: 103, Age: 30, First: Jack, Last: Ma
ID: 106, Age: 28, First: Curry, Last: Stephen
ID: 107, Age: 32, First: Kobe, Last: Bryant
Goodbye!

F:\worksp\jdbc>