Compartir por


Control de errores

Descargar controlador JDBC

Cuando se usa el controlador JDBC de Microsoft para SQL Server, todas las condiciones de error de la base de datos se devuelven a la aplicación Java como excepciones que usan la clase SQLServerException. Los siguientes métodos de la clase SQLServerException se heredan de java.sql.SQLException y java.lang.Throwable y se pueden emplear para devolver información específica sobre el error de SQL Server que se ha producido:

  • getSQLState() devuelve el código de estado X/Open o SQL99 de la excepción.

  • getErrorCode() devuelve el número específico del error de la base de datos.

  • getMessage() devuelve el texto completo de la excepción. El texto del mensaje de error describe el problema y, con frecuencia, incluye marcadores de posición de información tales como los nombres de los objetos, que se incluyen en el mensaje de error cuando se muestra.

  • getSQLServerError() devuelve el objeto SQLServerError que contiene información detallada sobre la excepción tal como se recibe de SQL Server. Este método devuelve NULL si no se ha producido ningún error de servidor.

Los siguientes métodos de la clase SQLServerError se pueden usar para obtener detalles adicionales sobre el error generado por el servidor.

  • SQLServerError.getErrorMessage() devuelve el mensaje de error tal como se recibe del servidor.

  • SQLServerError.getErrorNumber() devuelve un número que identifica el tipo del error.

  • SQLServerError.getErrorState() devuelve un código de error numérico del servidor SQL Server que representa un error, advertencia o mensaje "no se encuentran datos".

  • SQLServerError.getErrorSeverity() devuelve el nivel de gravedad del error recibido.

  • SQLServerError.getServerName() devuelve el nombre del equipo que ejecuta una instancia de SQL Server que generó el error.

  • SQLServerError.getProcedureName() devuelve el nombre del procedimiento almacenado o la llamada a procedimiento remoto (RPC) que generó el error.

  • SQLServerError.getLineNumber() obtiene el número de línea del procedimiento almacenado o lote de comandos de Transact-SQL que generó el error.

En el siguiente ejemplo, se pasa a la función una conexión abierta a la base de datos de ejemplo AdventureWorks2022 de SQL Server y se construye una instrucción SQL incorrecta que no incluye una cláusula FROM. A continuación, se ejecuta la instrucción de SQL y se procesa una excepción de 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);
    }
}

Uso de ServerMessageHandler

A partir de la versión 12.8.0, el controlador tiene un agregado ServerMessageHandler que permite una mayor cantidad de control sobre los comentarios y el registro de errores. Para usar ServerMessageHandler, debe implementar la interfaz ISQLServerMessageHandler. Las características de ServerMessageHandler incluyen lo siguiente:

Comentarios de mensajes

Permite recibir comentarios de consultas de larga duración (como mensajes de progreso). Por ejemplo, RAISERROR ('Progress message...', 0, 1) WITH NOWAIT.

Registro de errores universal

Permite que el controlador de mensajes controle el registro de todos los errores.

Control universal de errores

Le permite colocar la lógica de manejo de errores es solo el ServerMessageHandler, en lugar de repetir el mismo manejo de errores en toda la aplicación.

Reasignación de la gravedad del mensaje de error

Permite reconocer y cambiar la gravedad de los mensajes de error específicos:

  • SQLServerError.toSQLServerInfoMessage() devuelve un ISQLServerMessage, creado degradando un mensaje de error a un mensaje de información.

  • SQLServerError.toSQLServerInfoMessage(int newErrorSeverity) devuelve un ISQLServerMessage, creado degradando un mensaje de error a un mensaje de información, con una nueva gravedad de error.

  • SQLServerError.toSQLServerInfoMessage(int newErrorSeverity, int newErrorNumber) devuelve un ISQLServerMessage, creado degradando un mensaje de error a un mensaje de información, con una nueva gravedad y número de error.

  • SQLServerInfoMessage.toSQLServerError() devuelve un ISQLServerMessage, creado mediante la actualización de un mensaje de información a un mensaje de error.

  • SQLServerInfoMessage.toSQLServerError(int newErrorSeverity) devuelve un ISQLServerMessage, creado al actualizar un mensaje de información a un mensaje de error, con una nueva gravedad de error.

  • SQLServerInfoMessage.toSQLServerError(int newErrorSeverity, int newErrorNumber) devuelve un ISQLServerMessage, creado al actualizar un mensaje de información a un mensaje de error, con una nueva gravedad y número de error.

SQLExceptionChaining

También con la versión 12.8.0, las SQLExceptions pueden encadenarse, de modo que el mensaje de excepción final contiene automáticamente todas las excepciones que, de otro modo, podrían haberse perdido. Esta característica está habilitada de forma predeterminada.

Consulte también

Diagnóstico de problemas del controlador JDBC