In Postgres erhalten wir die "Stapelverfolgung" von Ausnahmen unter Verwendung dieses Codes:
EXCEPTION WHEN others THEN
GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT;
Dies funktioniert gut für "natürliche" Ausnahmen, aber wenn wir eine Ausnahme mit auslösen
RAISE EXCEPTION 'This is an error!';
... dann gibt es keine Stack-Trace. Laut einem Eintrag in einer Mailingliste könnte dies beabsichtigt sein, obwohl ich für mein ganzes Leben nicht herausfinden kann, warum. Ich möchte einen anderen Weg finden, um eine andere Ausnahme als die Verwendung auszulösenRAISE
. Vermisse ich nur etwas Offensichtliches? Hat jemand einen Trick dafür? Gibt es eine Ausnahme, die Postgres auslösen kann und die eine Zeichenfolge meiner Wahl enthält, sodass ich nicht nur meine Zeichenfolge in der Fehlermeldung, sondern auch die vollständige Stapelverfolgung erhalte?
Hier ist ein vollständiges Beispiel:
CREATE OR REPLACE FUNCTION error_test() RETURNS json AS $$
DECLARE
v_error_stack text;
BEGIN
-- Comment this out to see how a "normal" exception will give you the stack trace
RAISE EXCEPTION 'This exception will not get a stack trace';
-- This will give a divide by zero error, complete with stack trace
SELECT 1/0;
-- In case of any exception, wrap it in error object and send it back as json
EXCEPTION WHEN others THEN
-- If the exception we're catching is one that Postgres threw,
-- like a divide by zero error, then this will get the full
-- stack trace of the place where the exception was thrown.
-- However, since we are catching an exception we raised manually
-- using RAISE EXCEPTION, there is no context/stack trace!
GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT;
RAISE WARNING 'The stack trace of the error is: "%"', v_error_stack;
return to_json(v_error_stack);
END;
$$ LANGUAGE plpgsql;
error_info
? Sieht aus wie ein benutzerdefinierter Typ.