Fånga en kontextstack
Att hämta stackkontexten – vilket liknar en stackspårning i andra språk – är ett kraftfullt sätt att felsöka komplexa och nästlade funktioner.
I koden nedan vill vi fånga stackkontexten och registrera den i undantagshanterarna för båda nästlade blocken. Sedan granskar vi utdata i feltabellen för att ta reda på vad som orsakar undantaget i den här funktionen.
Den här övningen är en del av kursen
Transaktioner och felhantering i PostgreSQL
Övningsinstruktioner
- Deklarera en textvariabel,
exc_context, för att lagra stackkontexten. - Lagra
PG_EXCEPTION_CONTEXTi variabelnexc_contexti den första hanteraren. - Lagra
PG_EXCEPTION_DETAILi variabelnexc_detaili den andra hanteraren. - Registrera både felmeddelandet och stackkontexten i båda blocken.
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
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;