CommencerCommencer gratuitement

Capturer une pile de contexte

Récupérer le contexte de la pile, l’équivalent d’une trace de pile dans d’autres langages, est un excellent moyen de déboguer des fonctions complexes et imbriquées.

Dans le code ci-dessous, nous voulons capturer le contexte de la pile et l’enregistrer dans les gestionnaires d’exception des deux blocs imbriqués. Ensuite, nous examinerons sa sortie dans la table des erreurs pour comprendre ce qui provoque l’exception dans cette fonction.

Cet exercice fait partie du cours

Transactions et gestion des erreurs dans PostgreSQL

Afficher le cours

Instructions

  • Déclarez une variable texte, exc_context, pour stocker le contexte de la pile.
  • Stockez PG_EXCEPTION_CONTEXT dans notre variable exc_context dans le premier gestionnaire.
  • Stockez PG_EXCEPTION_DETAIL dans notre variable exc_detail dans le deuxième gestionnaire.
  • Enregistrez à la fois le message d’erreur et le contexte de la pile dans les deux blocs.

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

DO $$
DECLARE
   exc_message text;
   exc_details text;
   -- Declare a variable, exc_context to hold the exception context
   ___ ___;
BEGIN
    BEGIN
    	INSERT INTO patients (a1c, glucose, fasting) values (5.6, 93, TRUE),
        	(6.3, 111, TRUE),(4.7, 65, TRUE);
    EXCEPTION
        WHEN others THEN
        -- Store the exception context in exc_context
        GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
                                ___ = ___;
        -- Record both the msg and the context
        INSERT INTO errors (msg, context) 
           VALUES (___, ___);
    END;
	BEGIN
    	UPDATE patients set fasting = 'true' where id=1;
    EXCEPTION
        WHEN others THEN
        -- Store the exception detail in exc_details
        GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
                                ___ = ___;
        INSERT INTO errors (___, ___) 
           VALUES (exc_message, exc_context);
    END;
END$$;
SELECT * FROM errors;
Modifier et exécuter le code