다음을 통해 공유


오류 처리

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 드라이버 관련 문제 진단