Capturer un empilement de contexte
Obtenir le contexte de la pile, l'équivalent d'une pile d'appels dans d'autres langages, est une façon puissante 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 passerons en revue le résultat dans la table des erreurs pour aider à déboguer la cause de l'exception dans cette fonction.
Cette activité fait partie du cours
Transactions et gestion des erreurs dans PostgreSQL
Instructions de l’exercice
- Déclarez une variable de type texte,
exc_context, pour contenir 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. - Consignez à 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 ce code d’exemple.
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;