Partage via


Gestion des erreurs

Télécharger le pilote JDBC

Lors de l'utilisation du pilote JDBC Microsoft, toutes les erreurs de base de données sont retournées à votre application Java en tant qu'exceptions à l'aide de la classe SQLServerException. Les méthodes suivantes de la classe SQLServerException sont héritées de java.sql.SQLException et de java.lang.Throwable et elles peuvent être utilisées pour retourner des informations spécifiques sur l’erreur SQL Server qui s’est produite :

  • getSQLState() retourne l'état de code standard X/Open ou SQL99 de l'exception.

  • getErrorCode() retourne le numéro d'erreur de base de données spécifique.

  • getMessage() retourne le texte intégral de l'exception. Le texte du message d'erreur décrit le problème et inclut souvent des espaces réservés pour des informations, tels que des noms d'objets insérés dans le message d'erreur lors de son affichage.

  • getSQLServerError() retourne l’objet SQLServerError contenant des informations détaillées sur l’exception envoyée par SQL Server. Cette méthode retourne la valeur Null si aucune erreur de serveur ne s’est produite.

Les méthodes suivantes de la classe SQLServerError permettent d’obtenir des détails supplémentaires sur l’erreur générée à partir du serveur.

  • SQLServerError.getErrorMessage() retourne le message d’erreur envoyé par le serveur.

  • SQLServerError.getErrorNumber() retourne un nombre identifiant le type de l’erreur.

  • SQLServerError.getErrorState() retourne un code d’erreur numérique de SQL Server qui représente une erreur, un avertissement ou un message « Aucune donnée trouvée ».

  • SQLServerError.getErrorSeverity() retourne le niveau de gravité de l’erreur reçue.

  • SQLServerError.getServerName() retourne le nom de l’ordinateur exécutant une instance de SQL Server qui a généré l’erreur.

  • SQLServerError.getProcedureName() retourne le nom de la procédure stockée ou de l’appel de procédure distante (RPC) qui a généré l’erreur.

  • SQLServerError.getLineNumber() retourne le numéro de la ligne au sein du lot de commandes Transact-SQL ou de la procédure stockée qui a généré l’erreur.

Dans l’exemple suivant, une connexion ouverte à l’exemple de base de données SQL Server AdventureWorks2022 est passée à la fonction, et une instruction SQL incorrecte est créée sans clause FROM. Ensuite, l'instruction est exécutée et une exception SQL est traitée.

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

Avec ServerMessageHandler

À partir de la version 12.8.0, le pilote a ajouté ServerMessageHandler, ce qui vous donne davantage de contrôle sur les retours d’erreur et la journalisation. Pour utiliser ServerMessageHandler, vous devez implémenter l’interface ISQLServerMessageHandler. Les fonctionnalités de ServerMessageHandler incluent :

Commentaires de messages

Vous permet de recevoir des retours à partir de requêtes longues (comme des messages de progression). Par exemple, RAISERROR ('Progress message...', 0, 1) WITH NOWAIT.

Journalisation universelle des erreurs

Permet à votre gestionnaire de messages de gérer la journalisation de toutes les erreurs.

Gestion universelle des erreurs

Vous permet de placer la logique de gestion des erreurs uniquement dans ServerMessageHandler, plutôt que de répéter la même gestion des erreurs à travers votre application.

Remappage de la gravité des messages d’erreur

Vous permet de reconnaître et de modifier la gravité de messages d’erreur spécifiques :

  • SQLServerError.toSQLServerInfoMessage() retourne un ISQLServerMessage, créé en rétrogradant un message d’erreur en message d’information.

  • SQLServerError.toSQLServerInfoMessage(int newErrorSeverity) retourne un ISQLServerMessage, créé en rétrogradant un message d’erreur en message d’information, avec une nouvelle gravité d’erreur.

  • SQLServerError.toSQLServerInfoMessage(int newErrorSeverity, int newErrorNumber) retourne un ISQLServerMessage, créé en rétrogradant un message d’erreur en message d’information, avec une nouvelle gravité d’erreur et un numéro d’erreur.

  • SQLServerInfoMessage.toSQLServerError() retourne un ISQLServerMessage, créé en reclassant un message d’information en message d’erreur.

  • SQLServerInfoMessage.toSQLServerError(int newErrorSeverity) retourne un ISQLServerMessage, créé en reclassant un message d’information en message d’erreur, avec une nouvelle gravité d’erreur.

  • SQLServerInfoMessage.toSQLServerError(int newErrorSeverity, int newErrorNumber) retourne un ISQLServerMessage, créé en reclassant un message d’information en message d’erreur, avec une nouvelle gravité d’erreur et un numéro d’erreur.

SQLExceptionChaining

En outre, avec la version 12.8.0, les SQLExceptions peuvent être chaînées ensemble. Par conséquent, le message d’exception final contient automatiquement toutes les exceptions susceptibles d’avoir été perdues. Cette fonctionnalité est activée par défaut.

Voir aussi

Diagnostic de problèmes avec le pilote JDBC