JDBC - Xử lý ngoại lệ

Xử lý ngoại lệ cho phép bạn xử lý các điều kiện đặc biệt như lỗi do chương trình xác định theo cách có kiểm soát.

Khi một điều kiện ngoại lệ xảy ra, một ngoại lệ được ném ra. Thuật ngữ ném ra có nghĩa là việc thực thi chương trình hiện tại dừng lại và điều khiển được chuyển hướng đến mệnh đề bắt áp dụng gần nhất. Nếu không tồn tại mệnh đề bắt áp dụng, thì quá trình thực thi của chương trình sẽ kết thúc.

Xử lý ngoại lệ JDBC rất giống với xử lý ngoại lệ Java nhưng đối với JDBC, ngoại lệ phổ biến nhất mà bạn sẽ đối phó là java.sql.SQLException.

Phương pháp SQLException

SQLException có thể xảy ra cả trong trình điều khiển và cơ sở dữ liệu. Khi một ngoại lệ như vậy xảy ra, một đối tượng kiểu SQLException sẽ được chuyển đến mệnh đề catch.

Đối tượng SQLException được truyền có sẵn các phương thức sau để truy xuất thông tin bổ sung về ngoại lệ:

phương pháp Sự miêu tả
getErrorCode () Nhận số lỗi liên quan đến ngoại lệ.
getMessage () Nhận thông báo lỗi của trình điều khiển JDBC cho một lỗi, do trình điều khiển xử lý hoặc nhận số lỗi Oracle và thông báo cho lỗi cơ sở dữ liệu.
getSQLState () Nhận chuỗi SQLstate XOPEN. Đối với lỗi trình điều khiển JDBC, không có thông tin hữu ích nào được trả về từ phương pháp này. Đối với lỗi cơ sở dữ liệu, mã XOPEN SQLstate năm chữ số được trả về. Phương thức này có thể trả về null.
getNextException () Nhận đối tượng Ngoại lệ tiếp theo trong chuỗi ngoại lệ.
printStackTrace () In ngoại lệ hiện tại hoặc có thể ném ra, và nó in ngược dòng lỗi chuẩn.
printStackTrace (PrintStream s) In tệp có thể ném này và dấu vết của nó vào luồng in mà bạn chỉ định.
printStackTrace (PrintWriter w) In phần có thể ném này và nó sẽ được chuyển tới người viết bản in mà bạn chỉ định.

Bằng cách sử dụng thông tin có sẵn từ đối tượng Exception, bạn có thể bắt được một ngoại lệ và tiếp tục chương trình của mình một cách thích hợp. Đây là hình thức chung của khối thử -

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

Thí dụ

Nghiên cứu mã ví dụ sau để hiểu cách sử dụng try....catch...finally các khối.

//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

Bây giờ, chúng ta hãy biên dịch ví dụ trên như sau:

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

Khi bạn chạy JDBCExample, nó tạo ra kết quả sau nếu không có vấn đề gì, nếu không sẽ bắt được lỗi tương ứng và thông báo lỗi sẽ được hiển thị:

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:\>

Hãy thử ví dụ trên bằng cách chuyển sai tên cơ sở dữ liệu hoặc tên người dùng hoặc mật khẩu sai và kiểm tra kết quả.