Considérez le bloc suivant (incomplet) de PL/PGSQL à l'intérieur d'une fonction:
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
$$
Lorsqu'une erreur imprévue survient, ce code lancera une nouvelle exception avec le même message. Cependant, cela ne préservera pas le type ou le contexte d'origine.
Comment puis-je revenir ou retirez-vous l'exception originale non modifiée?
Vous pouvez utiliser RAISE
sans aucun paramètre. Ceci est documenté sur les erreurs et les messages page:
La dernière variante de
RAISE
n'a aucun paramètre du tout. Ce formulaire ne peut être utilisé qu'à l'intérieur d'une clauseBEGIN
bloqueEXCEPTION
; Il provoque l'erreur actuellement manipulée pour être renvoyée.
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
$$