11 mars 2014

SQL : Gestion d'erreur

Un petit exemple de gestion d'erreur dans SQL SERVER quand on a des procédures qui appellent des procédures !
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 :

  1. 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.
  2. Le contenu du bloc Catch : Qui construit un message personnalisé en fonction d'ou est apparue l'erreur :
Notez l'utilisation des procédures :
  •  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.

L'erreur est ensuite propagée à l'extérieur avec un RAISERROR qui reprend les informations de l'erreur originale (sévérité et statut) et un message adaptée à l'erreur.


Aucun commentaire:

Enregistrer un commentaire