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
Instructions
- Déclarez une variable texte,
exc_context, pour stocker le contexte de la pile. - Stockez
PG_EXCEPTION_CONTEXTdans notre variableexc_contextdans le premier gestionnaire. - Stockez
PG_EXCEPTION_DETAILdans notre variableexc_detaildans 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;