Trong Postgres, chúng tôi nhận được "dấu vết ngăn xếp" của các ngoại lệ sử dụng mã này:
EXCEPTION WHEN others THEN
GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT;
Điều này hoạt động tốt cho các ngoại lệ "tự nhiên", nhưng nếu chúng ta đưa ra một ngoại lệ bằng cách sử dụng
RAISE EXCEPTION 'This is an error!';
... Sau đó không có dấu vết ngăn xếp. Theo một mục nhập danh sách gửi thư , điều này có thể có chủ ý, mặc dù tôi không thể tìm ra lý do tại sao. Nó khiến tôi muốn tìm ra một cách khác để ném một ngoại lệ khác ngoài việc sử dụng RAISE
. Tôi chỉ thiếu một cái gì đó rõ ràng? Có ai có một mẹo cho việc này? Có một ngoại lệ nào tôi có thể khiến Postgres ném có chứa một chuỗi lựa chọn của tôi, để tôi không chỉ nhận được chuỗi của mình trong thông báo lỗi mà còn cả dấu vết ngăn xếp đầy đủ không?
Đây là một ví dụ đầy đủ:
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
? Trông giống như một loại tùy chỉnh.