In Postgres, otteniamo la "traccia stack" delle eccezioni usando questo codice:
EXCEPTION WHEN others THEN
GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT;
Questo funziona bene per le eccezioni "naturali", ma se solleviamo un'eccezione usando
RAISE EXCEPTION 'This is an error!';
... quindi non c'è traccia dello stack. Secondo una voce della mailing list , questo potrebbe essere intenzionale, anche se non posso per la vita di me capire perché. Mi fa venire voglia di capire un altro modo per lanciare un'eccezione diversa dall'uso RAISE
. Mi sto perdendo qualcosa di ovvio? Qualcuno ha un trucco per questo? Esiste un'eccezione che posso generare da Postgres che contiene una stringa di mia scelta, in modo da ottenere non solo la mia stringa nel messaggio di errore, ma anche la traccia dello stack completo?
Ecco un esempio 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
? Sembra un tipo personalizzato.