處理錯誤
使用 Microsoft JDBC Driver for SQL Server 時,所有資料庫錯誤狀況都會使用 SQLServerException 類別當作例外狀況傳回至您的 Java 應用程式。 SQLServerException 類別的下列方法均繼承自 java.sql.SQLException 和 java.lang.Throwable;它們可以用來傳回有關所發生之 SQL Server 錯誤的特定資訊:
getSQLState()
傳回例外狀況的標準 X/Open 或 SQL99 狀態碼。getErrorCode()
傳回特定的資料庫錯誤號碼。getMessage()
傳回例外狀況的全文。 錯誤訊息文字會描述問題,而且通常會包括預留位置,以用於顯示錯誤訊息時要插入其中的資訊,例如物件名稱。getSQLServerError()
傳回SQLServerError
物件,其中包含從 SQL Server 收到之例外狀況的詳細資訊。 如果未發生任何伺服器錯誤,則這個方法會傳回 null。
您可以使用 SQLServerError
類別的下列方法,來取得有關從伺服器產生之錯誤的其他詳細資料。
SQLServerError.getErrorMessage()
傳回從伺服器收到的錯誤訊息。SQLServerError.getErrorNumber()
傳回可識別錯誤類型的數字。SQLServerError.getErrorState()
從 SQL Server 傳回代表錯誤、警告或「找不到資料」訊息的數值錯誤碼。SQLServerError.getErrorSeverity()
傳回所收到錯誤的嚴重性層級。SQLServerError.getServerName()
傳回正在執行產生錯誤之 SQL Server 執行個體的電腦名稱。SQLServerError.getProcedureName()
傳回產生錯誤之預存程序或遠端程序呼叫 (RPC) 的名稱。SQLServerError.getLineNumber()
傳回產生錯誤之 Transact-SQL 命令批次或預存程序內的行號。
在下列範例中,SQL Server AdventureWorks2022 範例資料庫的開啟連線會傳入函式中,並建構一個格式錯誤的 SQL 陳述式 (其中不含 FROM 子句)。 然後,會執行語句,並處理 SQL 例外狀況。
public static void executeSQLException(Connection con) {
try (Statement stmt = con.createStatement();) {
String SQL = "SELECT TOP 10 * Person.Contact";
ResultSet rs = stmt.executeQuery(SQL);
while (rs.next()) {
System.out.println(rs.getString("FirstName") + " " + rs.getString("LastName"));
}
}
catch (SQLException se) {
do {
System.out.println("SQL STATE: " + se.getSQLState());
System.out.println("ERROR CODE: " + se.getErrorCode());
System.out.println("MESSAGE: " + se.getMessage());
System.out.println();
}
while (se != null);
}
}
使用 ServerMessageHandler
從 12.8.0 版開始,驅動程式已新增 ServerMessageHandler
,允許對錯誤意見反應和記錄有更大的控制權。 若要使用 ServerMessageHandler
,則需要實作 ISQLServerMessageHandler
介面。 ServerMessageHandler
的功能包括:
訊息意見反應
可讓您接收來自長時間執行查詢的意見反應 (例如進度訊息)。 例如,RAISERROR ('Progress message...', 0, 1) WITH NOWAIT
。
通用錯誤記錄
可讓您的訊息處理常式處理所有錯誤的記錄。
通用錯誤處理
可讓您放置錯誤處理邏輯只是 ServerMessageHandler
,而不是在整個應用程式中重複相同的錯誤處理。
重新對應錯誤訊息嚴重性
可讓您辨識並變更特定錯誤訊息的嚴重性:
SQLServerError.toSQLServerInfoMessage()
會傳回ISQLServerMessage
,方法是將錯誤訊息降級為資訊訊息。SQLServerError.toSQLServerInfoMessage(int newErrorSeverity)
會傳回ISQLServerMessage
,方法是將錯誤訊息降級為資訊訊息,並提供新的錯誤嚴重性。SQLServerError.toSQLServerInfoMessage(int newErrorSeverity, int newErrorNumber)
會傳回ISQLServerMessage
,方法是將錯誤訊息降級為資訊訊息,並提供新的錯誤嚴重性和錯誤號碼。SQLServerInfoMessage.toSQLServerError()
會傳回ISQLServerMessage
,方法是將資訊訊息升級為錯誤訊息。SQLServerInfoMessage.toSQLServerError(int newErrorSeverity)
會傳回ISQLServerMessage
,方法是將資訊訊息升級為錯誤訊息,並提供新的錯誤嚴重性。SQLServerInfoMessage.toSQLServerError(int newErrorSeverity, int newErrorNumber)
會傳回ISQLServerMessage
,方法是將資訊訊息升級為錯誤訊息,並提供新的錯誤嚴重性和錯誤號碼。
SQLExceptionChaining
此外,在 12.8.0 版中,SQLExceptions 也可以鏈結在一起,因此最終例外狀況訊息會自動包含可能已遺失的所有例外狀況。 此功能預設為啟用。