Affichage des articles dont le libellé est Try Catch. Afficher tous les articles
Affichage des articles dont le libellé est Try Catch. Afficher tous les articles

14 août 2015


Avec Sql Server, l'instruction TRY CATCH permet de récupérer des erreurs, mais que faire quand on est dans une transaction.

Voici un modèle qui fonctionne bien.


BEGIN TRY
   BEGIN TRANSACTION    
   --- Faire ce qu'on a a faire ici
   
   COMMIT
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0
     ROLLBACK

  --- Traiter l'erreur ici    


END CATCH




Les points à ne pas oublier :
  • L'instruction BEGIN TRANSACTION est juste après le BEGIN TRY (= y a rien entre les 2 instructions)
  • Le COMMIT termine le traitement est est juste avant le END TRY (= la aussi y a rien entre les 2 instructions)
  • Le test de présence de transaction et le ROLLBACK sont fait dès le début du BEGIN CATCH

Enjoy

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.