APSQL

Les messages d'erreur

Il existe de nombreux messages d'erreurs prédéfinis, qu'il est possible de lever avec l'instruction RAISERROR. Il est toutefois possible de définir ses propres messages d'erreur par l'intermédiaire de sp_addmessage.

Chaque message est caractérisé par les éléments suivants:

  • numéro: numéro qui permet d'identifier l'erreur
  • gravité: niveau compris entre 1 et 25 afin de mesurer l'importance de l'erreur
  • message: message explicatif de l'erreur
  • langue: permet de connaitre la langue relative au message. L'adaptation est faite de façon automatique en fonction des paramètres de langues de la connexion.

Exemple d'ajout de messages

Les messages personnalisé portent un numéro supérieur strictement à 50000. Les messages personnalisés doivent tout d'abord être défini dans la langue anglaise avant de pouvoir être définis pour une version localisé de SQL Server. Il est en plus possible de forcer l'inscription du message dans l'observateur des évènements de Widows (with_log). Enfin la procédure sp_addmessage permet de remplacer un message existant avec l'option with replace.

Syntaxe: sp_addmessage  @msgnum = numéro, @severity =gravité,  @msgtext =message
[ , @lang =  'langue'  ][ , @with_log =] 'with_log' ]
[ , @replace =  'replace']

Exemple ajout de messages
Telecharger le code

Exemple d'utilisation de RAISERROR

L'instruction RAISERROR permet de lever une erreur prédéfinie, ou bien de définir de façon dynamique son propre message d'erreur. Dans ce dernier cas, l'erreur ne porte pas de numéro mais il est nécessaire de définir le message. Pour chaque erreur levée avec RAISERROR il est possible de fixer un niveau de gravité. Chaque message possède également un état qui est représentée par un entier compris entre 1 et 127.

Syntaxe: RAISERROR ( { numéro | message } { ,gravité ,état } [ ,paramètre...] )
[ WITH option ... ]

Exemple RAISERROR
Telecharger le code

Le mécanisme Try/Catch

Comme dans de nombreux langages de programmation, le Transact SQL permet de gérer les exceptions dans un un bloc TRY/CATCH. Avec ce type de bloc, il est possible de gérer les exception de façon groupé à la suite des instructions qui composent la logique du lot Transact SQL.  Le programme est plus clair car il n'est pas encombré des tests de gestion des erreurs, ces tests étaient réalisées dans les versions précédentes de SQL Server en testant la valeur contenue dans la variable @@error.

En Transact SQL il est nécessaire de définir les 2 blocs Try et Catch l'un à la suite de l'autre. Si une exception est levée dans le bloc TRY, alors l'exécution séquentielle des instruction est stoppé et le bloc CATCH est exécuté. Dans la pratique le fonctionnement est très proche de celui rencontré avec l'instruction On Error Goto présente dans de nombreux langages de type Basic.

Le bloc TRY

Il débute par l'instruction BEGIN TRY et se termine par END TRY.  Le bloc TRY est exécuté de façon systématique. si aucune exception n'est produite par l'exécution du bloc, alors le bloc CATCH n'est pas exécuté et c'est l'instruction située immédiatement après.

Si une erreur de gravité supérieure ou égale à 20 l'exécution du lot d'instruction peut être annulé. Dans ce cas les instructions du bloc CATCH ne sont pas exécutées. De même si le niveau de gravité du message est inférieur à 10, il s'agit d'informations et donc le bloc CATCH ne sera pas non plus exécuté.

Le bloc CATCH

Il débute par l'instruction BEGIN CATCH et se se termine par END CATCH. L'instruction BEGIN CATCH doit suivre immédiatement l'instruction END TRY. Il peut pas y avoir d'instruction entre les 2 blocs. L'exécution de ce bloc est conditionné au fait qu'une exception est levé dans le bloc TRY. Après l'exécution de ce bloc, c'est l'instruction qui suit immédiatement le bloc qui est exécuté. Il n'est pas possible depuis le bloc CATCH de retourner dans le bloc TRY afin d'y poursuivre l'exécution.

Pour traiter les erreurs il est possible de faire appel aux fonctions suivantes:

Fonction Description
ERROR_LINE() Numéro de la ligne ou l'erreur à était levée
ERROR_NUMBER() Numéro de l'erreur
ERROR_MESSAGE() Message de l'erreur
ERROR_PROCEDURE() Nom de la procédure à l'origine de l'erreur
ERROR_SEVERITY() Niveau de sévérité/gravité de l'erreur
ERROR_STATE() Numéro d'état de l'erreur

Exemple d'utilisation du bloc TRY/CATCH

Exemple bloc try/catch
Telecharger le code