Postgres에서는 다음 코드를 사용하여 예외의 "스택 추적"을 얻습니다.
EXCEPTION WHEN others THEN
GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT;
이것은 "자연스러운"예외에 대해서는 잘 작동하지만 다음을 사용하여 예외를 제기하면
RAISE EXCEPTION 'This is an error!';
... 스택 추적이 없습니다. 메일 링리스트 entry 에 따르면 , 이것은 내 의도를 알 수는 없지만 의도적 인 것일 수 있습니다. 를 사용하는 것 이외의 예외를 던지는 다른 방법을 찾고 싶습니다 RAISE
. 나는 명백한 것을 놓치고 있습니까? 누구든지 이것에 대한 트릭이 있습니까? 내가 선택한 문자열을 포함하는 Postgres가 던질 수있는 예외가 있습니까? 그래서 오류 메시지에 내 문자열뿐만 아니라 전체 스택 추적도 얻을 수 있습니까?
전체 예는 다음과 같습니다.
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
? 사용자 정의 유형처럼 보입니다.