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
<Kurs>Transaktionen und Fehlerbehandlung in PostgreSQL</Kurs>Übungsanweisungen
- 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 praktische Übung
Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.
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;