No Postgres, obtemos o "rastreamento de pilha" das exceções usando este código:
EXCEPTION WHEN others THEN
GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT;
Isso funciona bem para exceções "naturais", mas se criarmos uma exceção usando
RAISE EXCEPTION 'This is an error!';
... então não há rastreamento de pilha. De acordo com uma entrada na lista de discussão , isso pode ser intencional, embora eu não consiga descobrir o porquê. Isso me faz querer descobrir outra maneira de lançar uma exceção diferente de usar RAISE. Só estou perdendo algo óbvio? Alguém tem um truque para isso? Existe uma exceção que eu possa lançar o Postgres que contenha uma sequência de minha escolha, para que eu receba não apenas minha sequência na mensagem de erro, mas também o rastreamento completo da pilha?
Aqui está um exemplo completo:
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? Parece um tipo personalizado.