Di Postgres, kita mendapatkan "stack trace" pengecualian menggunakan kode ini:
EXCEPTION WHEN others THEN
GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT;
Ini berfungsi dengan baik untuk pengecualian "alami", tetapi jika kita menggunakan pengecualian
RAISE EXCEPTION 'This is an error!';
... maka tidak ada jejak tumpukan. Menurut entri milis , ini mungkin disengaja, meskipun saya tidak bisa seumur hidup mencari tahu mengapa. Itu membuat saya ingin mencari cara lain untuk melemparkan pengecualian selain menggunakan RAISE
. Apakah saya hanya melewatkan sesuatu yang jelas? Adakah yang punya trik untuk ini? Apakah ada pengecualian yang bisa membuat Postgres untuk melempar yang berisi string yang saya pilih, sehingga saya tidak hanya akan mendapatkan string saya dalam pesan kesalahan, tetapi jejak stack penuh juga?
Ini contoh lengkapnya:
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
? Sepertinya jenis khusus.