Deux procédures pour l'exemple :
CREATE PROCEDURE
PLANTE
AS
BEGIN
PRINT 'Je plante de temps en temps...' ;
IF (RAND() > 0.6)
PRINT 1/0;
ELSE
PRINT 'Pas cette
fois !';
END
;
CREATE PROCEDURE
Test_Erreur
AS
BEGIN
BEGIN TRY
PRINT 'Travail
en cours...';
EXEC PLANTE;
IF (RAND() > 0.6)
PRINT 1/0 ;
ELSE
PRINT 'Pas cette fois !' ;
END
PRINT 'Fini !' ;
END TRY
BEGIN CATCH
DECLARE @msg
VARCHAR(MAX), @proc VARCHAR(200) ;
DECLARE @sev
INT, @state INT;
SET @proc
= ERROR_PROCEDURE();
SELECT @msg
= 'Erreur' + CASE WHEN @proc = 'Test_Erreur' THEN '' ELSE ' dans ' + @PROC END + ' Ligne ' + CONVERT(VARCHAR(10), ERROR_LINE()) + ' : ' + ERROR_MESSAGE()
, @sev = ERROR_SEVERITY(), @state = ERROR_STATE();
RAISERROR (@msg, @sev, @state);
END CATCH
END
Lorsqu'on lance la procédure Test_Erreur, Si erreur à lieu, le message indique s'il a eu lieu dans la procédure Test_Erreur ou dans PLANTE.
Les ingrédients intéressants :
- BEGIN TRY / END TRY / BEGIN CATCH / END CATCH : Qui permettent de déclarer un bloc de code qui sera en mesure d’attraper les erreurs.
- Le contenu du bloc Catch : Qui construit un message personnalisé en fonction d'ou est apparue l'erreur :
- ERROR_PROCEDURE() Qui renvoie le nom de la procédure en erreur.
- ERROR_LINE() : Qui renvoie le numéro de la ligne qui a généré l'erreur dans la procédure.
- ERROR_MESSAGE() : Qui renvoie le message d'erreur
- ERROR_SEVERITY() : Qui renvoie le niveau ce criticité de l'erreur
- ERROR_STATE() : Qui renvoie le statut de l'erreur.
Aucun commentaire:
Enregistrer un commentaire