Einen Kontext-Stack erfassen
Den Stack-Kontext zu erhalten – ähnlich wie ein Stack-Trace in anderen Sprachen – ist eine mächtige Methode, um komplexe und verschachtelte Funktionen zu debuggen.
Im folgenden Code wollen wir den Stack-Kontext erfassen und in den Exception-Handlern beider verschachtelter Blöcke protokollieren. Anschließend prüfen wir die Ausgabe in der Tabelle für Fehler, um herauszufinden, was die Exception in dieser Funktion verursacht.
Diese Übung ist Teil des Kurses
Transaktionen und Fehlerbehandlung in PostgreSQL
Anleitung zur Übung
- Deklariere eine Textvariable
exc_context, die den Stack-Kontext hält. - Speichere
PG_EXCEPTION_CONTEXTim ersten Handler in unserer Variableexc_context. - Speichere
PG_EXCEPTION_DETAILim zweiten Handler in unserer Variableexc_detail. - Protokolliere sowohl die Fehlermeldung als auch den Stack-Kontext in beiden Blöcken.
Interaktive Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
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;