Dans Postgres, nous obtenons la "trace de pile" des exceptions en utilisant ce code:
EXCEPTION WHEN others THEN
GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT;
Cela fonctionne bien pour les exceptions "naturelles", mais si nous levons une exception en utilisant
RAISE EXCEPTION 'This is an error!';
... alors il n'y a pas de trace de pile. Selon une entrée de la liste de diffusion , cela pourrait être intentionnel, bien que je ne puisse pas comprendre pourquoi. Cela me donne envie de trouver une autre façon de lever une exception autre que l'utilisation RAISE
. Suis-je juste en train de manquer quelque chose d'évident? Quelqu'un at-il une astuce pour cela? Existe-t-il une exception que je peux demander à Postgres de lancer qui contiendrait une chaîne de mon choix, de sorte que j'obtienne non seulement ma chaîne dans le message d'erreur, mais également la trace complète de la pile?
Voici un exemple complet:
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
? Ressemble à un type personnalisé.