Partilhar via


Tratamento de erros

Baixar driver JDBC

Ao usar o Microsoft JDBC Driver para SQL Server, todas as condições de erro da base de dados são devolvidas à sua aplicação 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 podem ser usados para devolver informações específicas sobre o erro do SQL Server que ocorreu:

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

  • getErrorCode() devolve o número de erro específico da base de dados.

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

  • getSQLServerError() retorna o SQLServerError objeto contendo informações detalhadas sobre a exceção conforme recebida do SQL Server. Este método retorna nulo se não tiver ocorrido erro do servidor.

Os seguintes métodos da SQLServerError classe podem ser usados para obter mais detalhes sobre o erro gerado pelo servidor.

  • SQLServerError.getErrorMessage() devolve a mensagem de erro tal como recebida do servidor.

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

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

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

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

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

  • SQLServerError.getLineNumber() devolve o número da linha dentro do lote de comandos Transact-SQL ou procedimento armazenado que gerou o erro.

No exemplo seguinte, uma ligação aberta à base de dados de exemplo SQL Server AdventureWorks2025 é passada para a função e é construída uma instrução SQL mal formada que não tem uma cláusula FROM. Depois, 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 uma adição ServerMessageHandler que permite um maior controle sobre o feedback de erro e o registo. Para usar o ServerMessageHandler, é necessário implementar a ISQLServerMessageHandler interface. As características de ServerMessageHandler incluem:

Feedback sobre mensagens

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

Registo universal de erros

Permite que o teu manipulador de mensagens trate do registo de todos os erros.

Tratamento universal de erros

Permite-lhe colocar a lógica de tratamento de erros apenas no ServerMessageHandler, em vez de repetir o mesmo tratamento de erros em toda a sua aplicação.

Remapeamento da severidade das mensagens de erro

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

  • SQLServerError.toSQLServerInfoMessage() retorna um ISQLServerMessage, criado convertendo uma mensagem de erro em uma mensagem de informação.

  • SQLServerError.toSQLServerInfoMessage(int newErrorSeverity) devolve um ISQLServerMessage, criado ao rebaixar uma mensagem de erro para uma mensagem de informação, com uma nova severidade de erro.

  • SQLServerError.toSQLServerInfoMessage(int newErrorSeverity, int newErrorNumber) devolve um ISQLServerMessage, criado ao converter uma mensagem de erro para uma mensagem de informação, com nova gravidade e número de erro.

  • SQLServerInfoMessage.toSQLServerError() retorna um ISQLServerMessage, criado ao atualizar uma mensagem de informação para uma mensagem de erro.

  • SQLServerInfoMessage.toSQLServerError(int newErrorSeverity) devolve um ISQLServerMessage, criado ao atualizar uma mensagem de informação para uma mensagem de erro, com uma nova gravidade de erro.

  • SQLServerInfoMessage.toSQLServerError(int newErrorSeverity, int newErrorNumber) retorna um ISQLServerMessage, criado ao atualizar uma mensagem de informação para uma mensagem de erro, com um novo nível de gravidade e número de erro.

Encadeamento de SQLException

Também com a versão 12.8.0, os SQLExceptions podem ser encadeados, pelo que a mensagem final de exceção contém automaticamente todas as exceções que poderiam ter sido perdidas. Este recurso é ativado por padrão.

Consulte também

Diagnóstico de problemas com o driver JDBC