다음을 통해 공유


오류 처리

JDBC 드라이버 다운로드

SQL Server용 Microsoft JDBC Driver를 사용하면 모든 데이터베이스 오류 조건이 SQLServerException 클래스를 통해 Java 애플리케이션에 예외로 반환됩니다. 다음 SQLServerException 클래스의 메서드는 java.sql.SQLException 및 java.lang.Throwable에서 상속되며, 발생한 SQL Server 오류에 대한 특정 정보를 반환하는 데 사용됩니다.

  • getSQLState()는 표준 X/Open 또는 SQL99 예외의 상태 코드를 반환합니다.

  • getErrorCode()는 특정 데이터베이스 오류 번호를 반환합니다.

  • getMessage()는 예외의 전체 텍스트를 반환합니다. 오류 메시지 텍스트에는 문제에 대한 설명이 나와 있으며, 표시될 때 오류 메시지에 삽입된 개체 이름 같은 정보에 대한 자리 표시자가 자주 포함되어 있습니다.

  • getSQLServerError()는 SQL Server에서 받은 예외에 대한 자세한 정보가 포함된 SQLServerError 개체를 반환합니다. 서버 오류가 발생하지 않은 경우 이 메서드는 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 데이터베이스에 대해 열린 연결을 함수로 전달하고, FROM 절이 없는 잘못된 형식의 SQL 문을 생성합니다. 그런 다음 문이 실행되고 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 드라이버 관련 문제 진단