Tratando erros

Baixar o JDBC Driver

Ao usar o Microsoft JDBC Driver para SQL Server, todas as condições de erro de banco de dados são retornadas para seu aplicativo Java como exceções usando a classe SQLServerException. Os seguintes métodos da classe SQLServerException são herdados de java.sql.SQLException e java.lang.Throwable; e eles podem ser usados para retornar informações específicas sobre o erro do SQL Server que ocorreu:

  • O getSQLState() retorna o código de estado padrão X/Open ou SQL99 da exceção.

  • O getErrorCode() retorna o número de erro de banco de dados específico.

  • O getMessage() retorna o texto completo da exceção. O texto da mensagem de erro descreve o problema e frequentemente inclui marcadores para informações, como nomes de objetos, que são inseridos na mensagem de erro quando ela é exibida.

  • O getSQLServerError() retorna o objeto SQLServerError que contém informações detalhadas sobre a exceção, conforme recebido do SQL Server. Esse método retornará nulo se nenhum erro de servidor tiver ocorrido.

Os métodos a seguir da classe SQLServerError podem ser usados para obter detalhes adicionais sobre o erro gerado no servidor.

  • O SQLServerError.getErrorMessage() retorna a mensagem de erro como recebida do servidor.

  • O SQLServerError.getErrorNumber() retorna um número que identifica o tipo do erro.

  • O SQLServerError.getErrorState() retorna um código de erro numérico do SQL Server que representa um erro, aviso ou mensagem "nenhum dado encontrado".

  • O SQLServerError.getErrorSeverity() retorna o nível de gravidade do erro recebido.

  • O SQLServerError.getServerName() retorna o nome do computador que está executando uma instância do SQL Server que gerou o erro.

  • O SQLServerError.getProcedureName() retorna o nome do procedimento armazenado ou RPC (chamada de procedimento remoto) que gerou o erro.

  • O SQLServerError.getLineNumber() retorna o número de linha no lote de comandos Transact-SQL ou no procedimento armazenado que gerou o erro.

No exemplo a seguir, uma conexão aberta com o banco de dados de exemplo AdventureWorks2025 do SQL Server é passada para a função, e uma instrução SQL malformada é construída sem uma cláusula FROM. Em seguida, a instrução é executada e uma exceção SQL é processada.

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);
    }
}

Usando o ServerMessageHandler

A partir da versão 12.8.0, o driver tem um ServerMessageHandler adicional que permite uma maior quantidade de controle sobre o feedback de erro e os logs. Para usar o ServerMessageHandler, é necessário implementar a interface ISQLServerMessageHandler. Os recursos do ServerMessageHandler incluem:

Feedback da mensagem

Permite que você receba feedback de consultas de longa duração (como mensagens de progresso). Por exemplo, RAISERROR ('Progress message...', 0, 1) WITH NOWAIT.

Registro universal de erros

Permite que o manipulador de mensagens manipule os logs de todos os erros.

Tratamento de erros universal

Permite que você coloque a lógica de tratamento de erros apenas como ServerMessageHandler, em vez de repetir o mesmo tratamento de erros em todo o aplicativo.

Remapeamento da gravidade da mensagem de erro

Permite reconhecer e alterar a gravidade de mensagens de erro específicas:

  • SQLServerError.toSQLServerInfoMessage() retorna um ISQLServerMessage, criado ao rebaixar uma mensagem de erro para uma mensagem informativa.

  • SQLServerError.toSQLServerInfoMessage(int newErrorSeverity) retorna um ISQLServerMessage, criado ao rebaixar uma mensagem de erro para uma mensagem informativa, com um novo nível de severidade.

  • SQLServerError.toSQLServerInfoMessage(int newErrorSeverity, int newErrorNumber) retorna um ISQLServerMessage, obtido ao rebaixar uma mensagem de erro para uma mensagem informativa, com nova gravidade e novo número de erro.

  • SQLServerInfoMessage.toSQLServerError() retorna um ISQLServerMessage, criado ao converter uma mensagem informativa em uma mensagem de erro.

  • SQLServerInfoMessage.toSQLServerError(int newErrorSeverity) retorna um ISQLServerMessage, criado ao elevar uma mensagem informativa a uma mensagem de erro, com uma nova severidade de erro.

  • SQLServerInfoMessage.toSQLServerError(int newErrorSeverity, int newErrorNumber) retorna um ISQLServerMessage, criado pela conversão de uma mensagem informativa em uma mensagem de erro, com nova severidade e novo número de erro.

SQLExceptionChaining

Também na versão 12.8.0, as SQLExceptions podem ser encadeadas, de modo que a mensagem de exceção final contém automaticamente todas as exceções que podem ter sido perdidas. Esse recurso está habilitado por padrão.