分享方式:


處理錯誤

下載 JDBC 驅動程式

使用 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 也可以鏈結在一起,因此最終例外狀況訊息會自動包含可能已遺失的所有例外狀況。 此功能預設為啟用。

另請參閱

診斷 JDBC 驅動程式的問題