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:
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']
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 ... ]
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.
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é.
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 |