LoslegenKostenlos starten

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>
Kurs ansehen

Übungsanweisungen

  • Deklariere eine Textvariable exc_context, die den Stack-Kontext hält.
  • Speichere PG_EXCEPTION_CONTEXT im ersten Handler in unserer Variable exc_context.
  • Speichere PG_EXCEPTION_DETAIL im zweiten Handler in unserer Variable exc_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;
Code bearbeiten und ausführen