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