Getsuyodev, Programming is mainly used when constructing an application. Programming requires knowledge of application domains, algorithms, and programming language expertise. Programming can be developed in different logic based on developer knowledge.

SGBD – Gestion des exceptions

Système de gestion de base de données



Introduction:

  • Ce chapitre a pour objectif de vous initier à la gestion des exceptions sous SQL Server.
  • Comme tout langage de programmation vous disposerez de la possibilité d’intercepter les exceptions et de générer éventuellement des exceptions sur des conditions particulières survenant lors de l’exécution de votre programme.
  • Les erreurs du code Transact-SQL peuvent être traitées à l’aide d’une construction TRY…CATCH semblable aux fonctionnalités de gestion des exceptions des langages Microsoft Visual Basic et Microsoft Visual C#.

Bloc Try Catch:

  • Une construction TRY…CATCH comprend deux parties : un bloc TRY et un bloc CATCH.
  • Lorsque le système détecte une condition d’erreur dans une instruction Transact-SQL incluse dans un bloc TRY, le contrôle est transmis à un bloc CATCH où l’erreur peut être traitée.
  • Une fois que le bloc CATCH a traité l’exception, le contrôle est transféré à la première instruction Transact-SQL qui suit l’instruction END CATCH.
  • Si l’instruction END CATCH représente la dernière instruction d’une procédure stockée ou d’un déclencheur, le contrôle est retourné au code qui a appelé la procédure stockée ou le déclencheur.  Nous verrons ce point lors de la programmation de ces objets sur le serveur.
  • Les instructions Transact-SQL du bloc TRY suivant l’instruction qui génère une erreur ne sont pas exécutées.
  • En l’absence d’erreurs dans le bloc TRY, le contrôle est transmis à l’instruction située immédiatement après l’instruction END CATCH associée.
  • Si l’instruction END CATCH est la dernière instruction d’une procédure stockée ou d’un déclencheur, le contrôle est transmis à l’instruction qui a appelé la procédure stockée ou le déclencheur.
  • Un bloc TRY commence par l’instruction BEGIN TRY et finit par l’instruction END TRY.
  • Vous pouvez spécifier une ou plusieurs instructions Transact-SQL entre les instructions BEGIN TRY et END TRY.
  • Un bloc TRY doit être immédiatement suivi d’un bloc CATCH. Un bloc CATCH commence par l’instruction BEGIN CATCH et finit par l’instruction END CATCH.

Dans Transact-SQL, chaque bloc TRY est associé à un seul bloc CATCH.

Mise en œuvre :

Chaque construction TRY…CATCH doit être contenue dans un lot, une procédure stockée ou un déclencheur unique.

Par exemple, vous ne pouvez pas insérer un bloc TRY dans un lot et le bloc CATCH associé dans un autre lot. Le script suivant génère une erreur :

La construction valide serait :

Pour tout bloc TRY doit correspondre un et un seul bloc CATCH

Un bloc TRY doit être immédiatement suivi d’un bloc CATCH.

Imbrication des Try Catch

Les constructions TRY…CATCH peuvent être imbriquées. Cela signifie que les constructions TRY…CATCH peuvent être insérées dans d’autres blocs TRY et CATCH.

Lorsqu’une erreur se produit dans un bloc TRY imbriqué, le contrôle du programme est transféré au bloc CATCH associé au bloc TRY imbriqué.

Par exemple, vous pouvez vouloir gérer une erreur qui se produit dans un bloc CATCH donné. Ecrivez alors un bloc TRY……CATCH dans le bloc CATCH spécifié.

Niveau de gravité

Les erreurs dont le niveau de gravité est supérieur ou égal à 20 et qui contraignent le moteur de base de données à fermer la connexion ne sont pas gérées par le bloc TRY…CATCH.

Toutefois, le bloc TRY…CATCH gère les erreurs dont le niveau de gravité est supérieur ou égal à 20 tant que la connexion n’est pas fermée.

Les erreurs dont le niveau de gravité est inférieur ou égal à 10 sont considérées comme des avertissements ou des messages d’information et ne sont pas gérées par les blocs TRY…CATCH.

Informations des erreurs :

Le bloc TRY…CATCH utilise les fonctions de gestion des erreurs suivantes pour capturer les informations d’erreur :

  • ERROR_NUMBER() retourne le numéro de l’erreur.
  • ERROR_MESSAGE() retourne le texte complet du message d’erreur. Le texte comprend les valeurs fournies pour tous les paramètres substituables, tels que les longueurs, les noms d’objets ou les heures.
  • ERROR_SEVERITY() retourne le niveau de gravité.
  • ERROR_STATE() retourne le numéro d’état de l’erreur.
  • ERROR_LINE() retourne le numéro de ligne de la routine à l’origine de l’erreur.
  • ERROR_PROCEDURE() retourne le nom de la procédure stockée ou du déclencheur dans lequel l’erreur s’est produite.

Ces fonctions permettent de récupérer les informations d’erreur de n’importe où dans l’étendue du bloc CATCH d’une construction TRY…CATCH. Elles retournent la valeur NULL si elles sont appelées en dehors de l’étendue d’un bloc CATCH.

Elles peuvent être référencées dans une procédure stockée et utilisées pour récupérer les informations d’erreur lorsque la procédure stockée est exécutée dans le bloc CATCH.

De cette manière, vous n’avez pas besoin de répéter le code de gestion d’erreur dans chaque bloc CATCH.

L’exemple suivant vous montre comment récupérer quelques informations sur les erreurs. Nous verrons par la suite comment mettre en place un système de gestion des erreurs plus sophistiqué en encapsulant ces instructions dans une procédure.

Définition des conditions propres d’exceptions :

L’instruction RAISERROR vous permet de définir la manière dont les erreurs seront gérées.

Vous pouvez utiliser RAISERROR dans le bloc TRY ou CATCH d’une construction TRY…CATCH.

Si RAISERROR a un niveau de gravité compris entre 11 et 19 et qu’il est exécuté dans un bloc TRY, le contrôle est transféré au bloc CATCH associé.

Si RAISERROR possède un niveau de gravité compris entre 11 et 19 et qu’il est exécuté dans un bloc CATCH, il retourne une erreur à l’application ou au lot appelant. Ainsi, RAISERROR permet de retourner à l’appelant des informations sur l’erreur à l’origine de l’exécution du bloc CATCH.

Les informations d’erreur fournies par les fonctions d’erreur TRY…CATCH peuvent être capturées dans le message RAISERROR, notamment le numéro d’erreur d’origine ; toutefois, le numéro d’erreur de RAISERROR doit être supérieur ou égal à 50000.

Les numéros d’erreur compris entre 1 et 50000 sont réservés au système.

Vos propres erreurs devront donc avoir un numéro supérieur à 50 000.

Les règles pour vos propres exceptions ne sont pas différentes de celles relatives aux exceptions prédéfinies sur le système. Ainsi :

  • Si RAISERROR possède un niveau de gravité inférieur ou égal à 10, il retourne un message d’information à l’application ou au lot appelant sans solliciter un bloc CATCH.  
  • Si RAISERROR possède un niveau de gravité supérieur ou égal à 20, il met fin à la connexion à la base de données sans appeler le bloc CATCH.

Vous pouvez prédéfinir vos exceptions dans le fichier sys.messages du système.

Les règles de construction des messages sont les mêmes qu’ils soient prédéfinis ou définis lors de l’exécution.

Pour cela, vous pouvez avoir recours à l’interface graphique si vous disposez de la console de management de SQL Serveur ou à la procédure stockée système sp_Addmessage dans tous les cas de figure.

msg_id :

Numéro du message d’erreur défini par l’utilisateur et stocké dans l’affichage catalogue sys.messages à l’aide de sp_addmessage.

Lorsque l’argument msg_id n’est pas spécifié, RAISERROR génère un message d’erreur portant le numéro 50 000.

msg_str :

Message d’erreur défini par l’utilisateur dont la mise en forme est proche de la fonction printf dans la bibliothèque standard C.

Le message d’erreur peut compter jusqu’à 2 047 caractères.

Lorsque l’argument msg_str n’est spécifié, RAISERROR génère un message d’erreur portant le numéro 50 000.

msg_str : Mise en forme

Msg_str est une chaîne de caractères dotée de spécifications de conversion incorporées facultatives.

Chaque spécification de conversion définit la manière dont une valeur de la liste d’arguments est mise en forme et placée dans un champ à l’emplacement de la spécification de conversion dans msg_str.

Les spécifications de conversion arborent la mise en forme suivante :

% [[flag] [width] [. precision] [{h | l}]] type

Nous ne verrons ici que les utilisations les plus courantes, pour tout connaître se reporter au manuel de référence de SQL Server.

Exemples :

La forme la plus simple:

RAISERROR  5551212   ‘Message: RAISERROR Simple forme’

La version complète:

RAISERROR(‘Message: RAISERROR version complète’, 14, 1)

Exemples 
: Gravité d’erreur
 
 RAISERROR(‘Print’, 10, 1)
 RAISERROR(‘Info’, 14, 1)
 RAISERROR(‘Warning’, 15, 1)
 RAISERROR(‘Critical’, 16, 1) 
Exemples 
: Ajout de paramètres dans le message
 
 RAISERROR(‘Un message %s avec paramètre’, 14, 1, ‘formatté’ ) 
Exemples 
: Sauvegarde des messages
 
 EXEC sp_addmessage 50001, 16, ‘Message à enregistrer avec %s’
 
 (SELECT * FROM sys.messages WHERE message_id > 50000)
 
 EXEC sp_dropmessage 50001 
Exemples 
: Erreurs fatales
 
 SELECT Error, Severity, Description
 FROM Master.dbo.sysMessages
 WHERE Severity > 16 

Comments are closed, but trackbacks and pingbacks are open.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More