例外處理允許我們以受控的方式處理異常情況,而不是直接退出程式,例如程式定義的錯誤。
發生異常時可以丟擲異常。術語「異常」表示當前的程式執行停止,並且被重定向到最近的適用的catch
子句。如果沒有適用的catch
子句存在,則程式的執行結束。
JDBC例外處理與Java例外處理非常相似,但對於JDBC,要處理的最常見異常是java.sql.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>