Postgresql
如何在 PL/pgSQL EXCEPTION 塊中重新引發異常?
考慮函式內的以下(不完整的)PL/pgSQL 塊:
CREATE OR REPLACE FUNCTION my_calc(myvar1 NUMERIC, myvar2 NUMERIC) RETURNS NUMERIC RETURNS NULL ON NULL INPUT IMMUTABLE LANGUAGE plpgsql AS $$ BEGIN RETURN some_third_party_function(myvar1, myvar2); EXCEPTION WHEN internal_error THEN IF SQLERRM LIKE 'KnownErrorPrefix:%' THEN RETURN 0; ELSE -- Reraise the original exception here RAISE EXCEPTION '%', SQLERRM; END IF; END $$
當發生意外錯誤時,此程式碼將拋出具有相同消息的新異常。但是,它不會保留原始類型或上下文。
如何重新引發或重新拋出未修改的原始異常?
您可以
RAISE
不帶任何參數使用。這記錄在錯誤和消息頁面上:的最後一個變體
RAISE
根本沒有參數。這種形式只能在BEGIN
塊的EXCEPTION
子句中使用;它會導致目前正在處理的錯誤被重新拋出。CREATE OR REPLACE FUNCTION my_calc(myvar1 NUMERIC, myvar2 NUMERIC) RETURNS NUMERIC RETURNS NULL ON NULL INPUT IMMUTABLE LANGUAGE plpgsql AS $$ BEGIN RETURN some_third_party_function(myvar1, myvar2); EXCEPTION WHEN internal_error THEN IF SQLERRM LIKE 'KnownErrorPrefix:%' THEN RETURN 0; ELSE -- Reraise the original exception here RAISE; END IF; END $$