Déclencher et intercepter une exception
Dans cette étape, vous apprendrez à gérer les erreurs d'exécution, connues sous le nom d'exceptions. Une exception non gérée terminera immédiatement votre fonction. Vous allez d'abord créer une fonction qui échoue, puis la modifier pour capturer l'exception gracieusement.
Créons une fonction simple_divide qui effectue une division entière. Cette fonction présente un défaut potentiel : elle plantera si vous essayez de diviser par zéro.
CREATE OR REPLACE FUNCTION simple_divide(numerator INTEGER, denominator INTEGER)
RETURNS INTEGER AS $$
BEGIN
RETURN numerator / denominator;
END;
$$ LANGUAGE plpgsql;
Appelez d'abord la fonction avec des entrées valides pour confirmer qu'elle fonctionne correctement :
SELECT simple_divide(10, 2);
La sortie sera le résultat de la division :
simple_divide
---------------
5
(1 row)
Appelez maintenant la fonction avec un dénominateur nul pour déclencher une exception :
SELECT simple_divide(10, 0);
Cette commande échouera et retournera un message d'erreur. L'exécution de la fonction est interrompue.
ERROR: division by zero
CONTEXT: PL/pgSQL function simple_divide(integer,integer) line 3 at RETURN
Ceci est une exception non gérée. Pour éviter que la fonction ne plante, vous pouvez utiliser un bloc EXCEPTION. Créons une nouvelle fonction safe_divide qui inclut la gestion des erreurs.
CREATE OR REPLACE FUNCTION safe_divide(numerator INTEGER, denominator INTEGER)
RETURNS INTEGER AS $$
BEGIN
RETURN numerator / denominator;
EXCEPTION
WHEN division_by_zero THEN
RAISE NOTICE 'Error: Cannot divide by zero.';
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
Voici comment fonctionne le bloc EXCEPTION :
BEGIN...END; : Ceci définit un bloc de code.
EXCEPTION : Ce mot-clé démarre la section de gestion des exceptions.
WHEN division_by_zero THEN : Ceci spécifie que le code suivant ne doit s'exécuter que lorsqu'une erreur division_by_zero se produit.
- Le code à l'intérieur du gestionnaire génère une notice et retourne
NULL au lieu de planter.
Appelez maintenant la nouvelle fonction safe_divide avec un dénominateur nul :
SELECT safe_divide(10, 0);
Cette fois, la fonction ne plante pas. Elle capture l'exception, affiche votre notice personnalisée et retourne NULL.
NOTICE: Error: Cannot divide by zero.
safe_divide
-------------
(1 row)
Vous avez réussi à capturer une exception spécifique et à contrôler la sortie de la fonction.