La gestion des erreurs dans le code PL/SQL peut être complexe.
Des erreurs non contrôlées peuvent entraîner des dysfonctionnements graves et des interruptions de service.
Cet article présente l’utilisation des exceptions utilisateur en PL/SQL pour anticiper et gérer efficacement ces erreurs.
Maîtriser le langage SQL en environnement SGBDR. SQL n'aura plus de secrets pour vous !
L’objectif de cette section est de vous guider dans la création et l’utilisation des exceptions utilisateur pour gérer des erreurs spécifiques au sein d’un code PL/SQL. Contrairement aux exceptions système qui se déclenchent automatiquement pour des erreurs internes ou Oracle, les exceptions utilisateur offrent la possibilité de contrôler des erreurs liées à la logique applicative. En définissant vos propres exceptions, vous pouvez anticiper des scénarios particuliers et y répondre de manière personnalisée en générant des messages d’erreur clairs et adaptés.
Rôle des Exceptions Utilisateur PL/SQL
Les exceptions utilisateur permettent de contrôler des erreurs spécifiques à la logique applicative. Contrairement aux exceptions système, celles-ci sont définies par le développeur pour gérer des scénarios particuliers en déclenchant des messages d’erreur adaptés.
La création et l’utilisation des exceptions utilisateur en PL/SQL suivent une structure simple, que nous détaillons ci-dessous :
DECLARE
EXCEPTION;
PRAGMA EXCEPTION_INIT(, );
BEGIN
...
RAISE ;
...
EXCEPTION
WHEN THEN
;
END;
Cette syntaxe permet de déclarer une exception utilisateur, de l’associer à un code d’erreur Oracle avec PRAGMA EXCEPTION_INIT, et d’utiliser RAISE pour déclencher l’exception manuellement.
Explication des éléments de la syntaxe
- Déclaration :Dans la section DECLARE, l’exception est définie en lui donnant un nom explicite, ce qui facilite sa lecture et son interprétation.
- Association avec PRAGMA EXCEPTION_INIT :Cette directive permet d’associer l’exception utilisateur à un code d’erreur Oracle. Ce n’est pas obligatoire, mais cela peut être utile pour standardiser certaines erreurs ou pour harmoniser les erreurs système et utilisateur dans votre application.
- Déclenchement avec RAISE :La commande RAISE permet de déclencher l’exception manuellement dès que les conditions définies par le développeur sont remplies. Cela permet d’interrompre le traitement en cours et d’alerter immédiatement sur la situation anormale.
- Gestion avec EXCEPTION :Dans le bloc EXCEPTION, vous spécifiez le traitement à appliquer en cas de déclenchement de l’exception utilisateur. Cela peut inclure l’affichage d’un message personnalisé, le log de l’erreur, ou d’autres actions correctives.
Exemple de Gestion des Erreurs PL/SQL
Dans cet exemple, une exception utilisateur DATEENVOI_NONVALIDE est définie pour gérer le cas où une date d’envoi est antérieure à la date de commande.
DECLARE
DATEENVOI_NONVALIDE EXCEPTION;
var_date_envoi commandes.date_envoi%TYPE := '27/07/2010';
var_date_com commandes.date_cde%TYPE;
var_numero_cde commandes.numero_cde%TYPE := 1001;
BEGIN
-- Récupère la date de commande pour une commande spécifique
SELECT date_cde INTO var_date_com FROM commandes
WHERE numero_cde = var_numero_cde;
-- Met à jour la date d'envoi pour la commande
UPDATE commandes SET date_envoi = var_date_envoi
WHERE numero_cde = var_numero_cde;
-- Vérifie si la date d'envoi est antérieure à la date de commande
IF var_date_envoi < var_date_com THEN
RAISE DATEENVOI_NONVALIDE; -- Déclenche l'exception
END IF;
EXCEPTION
WHEN DATEENVOI_NONVALIDE THEN
DBMS_OUTPUT.PUT_LINE('La date d''envoi ' || var_date_envoi || ' est antérieure à la date de la commande ' || var_date_com);
END;
Explication de l’exemple :
- Déclaration de l’exception :DATEENVOI_NONVALIDE est déclarée comme une exception personnalisée.
- Récupération des dates :La date de commande est récupérée pour vérifier la validité de la date d’envoi.
- Condition et déclenchement de l’exception :Si var_date_envoi est antérieure à var_date_com, l’exception DATEENVOI_NONVALIDE est déclenchée par RAISE.
- Gestion de l’Exception :Dans le bloc EXCEPTION, un message est affiché lorsque l’exception est déclenchée.
Utilisation de RAISE_APPLICATION_ERROR
RAISE_APPLICATION_ERROR permet de renvoyer une erreur personnalisée aux applications clientes, offrant ainsi une meilleure gestion des erreurs au niveau du serveur.
Exemple avec RAISE_APPLICATION_ERROR
Dans cet exemple, une vérification est faite pour s’assurer qu’une commande n’a pas de quantité négative. Si c’est le cas, un message d’erreur personnalisé est renvoyé à l’utilisateur via RAISE_APPLICATION_ERROR.
DECLARE
var_numero_cde LIGNES_COMMANDES.NUMERO_CDE%TYPE := 1001;
var_quantite LIGNES_COMMANDES.QUANTITE_CDE%TYPE;
BEGIN
-- Récupération de la quantité pour la commande spécifiée
SELECT QUANTITE_CDE INTO var_quantite
FROM LIGNES_COMMANDES
WHERE numero_cde = var_numero_cde;
-- Vérification de la quantité : si elle est négative, on déclenche une erreur personnalisée
IF var_quantite < 0 THEN
RAISE_APPLICATION_ERROR(
-20001, -- Code d'erreur personnalisé (entre -20000 et -20999)
'Erreur : la quantité de la commande ' || var_numero_cde || ' est négative.'
);
END IF;
DBMS_OUTPUT.PUT_LINE('La quantité de la commande est correcte.');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Une erreur est survenue : ' || SQLERRM);
END;
Explication de l’exemple
Récupération de la quantité : On extrait la quantité associée au numéro de commande.
Condition de validation : Si la quantité est inférieure à 0, une erreur personnalisée est déclenchée en utilisant RAISE_APPLICATION_ERROR.
- Le premier paramètre (-20001) est un code d’erreur utilisateur qui doit se situer entre -20000 et -20999.
- Le deuxième paramètre est un message personnalisé qui informe l’utilisateur de l’erreur.
Gestion des erreurs : Si une erreur survient, elle est affichée dans la console.
La sortie sera
Portée des Exceptions Système et PL/SQL
Une exception déclenchée quitte le bloc actuel et recherche un bloc supérieur où l’exception est capturée et gérée.
Exemple : Portée des Exceptions Personnalisées
Dans cet exemple, nous avons un bloc PL/SQL avec un bloc interne. L’exception est d’abord déclenchée dans le bloc interne. Si elle n’est pas gérée dans ce bloc, elle remonte au bloc externe pour y être traitée.
DECLARE
-- Déclaration d'une exception personnalisée
EXCEPTION_NON_VALIDE EXCEPTION;
BEGIN
DBMS_OUTPUT.PUT_LINE('Début du bloc externe.');
DECLARE
nombre_pos INT := -10; -- Nombre négatif pour déclencher une exception
BEGIN
DBMS_OUTPUT.PUT_LINE('Début du bloc interne.');
-- Vérification si le nombre est positif
IF nombre_pos < 0 THEN
RAISE EXCEPTION_NON_VALIDE; -- Déclenchement de l'exception
END IF;
DBMS_OUTPUT.PUT_LINE('Fin du bloc interne.');
EXCEPTION
-- Gestionnaire d'exception pour le bloc interne
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('Erreur dans le bloc interne : valeur incorrecte.');
-- L'exception EXCEPTION_NON_VALIDE n'est pas gérée ici, donc elle remonte au bloc externe
END;
-- Gestionnaire d'exception pour le bloc externe
EXCEPTION
WHEN EXCEPTION_NON_VALIDE THEN
DBMS_OUTPUT.PUT_LINE('Erreur dans le bloc externe : nombre négatif détecté.');
END;
Explication de l’exemple
Bloc Externe : Il inclut une exception personnalisée EXCEPTION_NON_VALIDE.
Bloc Interne : Ce bloc essaie de vérifier si nombre_pos est positif. Si nombre_pos est négatif, l’exception EXCEPTION_NON_VALIDE est déclenchée.
- L’exception EXCEPTION_NON_VALIDE n’a pas de gestionnaire dans le bloc interne.
Remontée de l’Exception : Comme EXCEPTION_NON_VALIDE n’est pas gérée dans le bloc interne, elle remonte au bloc externe, où elle est interceptée et gérée.
La sortie serait :
Cet exemple montre que si une exception n’est pas gérée dans un bloc interne, elle remonte dans la hiérarchie des blocs jusqu’à trouver un gestionnaire, illustrant la portée des exceptions en PL/SQL.
Formez-vous gratuitement avec Alphorm !
Maîtrisez les compétences clés en IT grâce à nos formations gratuites et accélérez votre carrière dès aujourd'hui.
FAQ
Qu'est-ce qu'une exception utilisateur en PL/SQL ?
Comment déclarer une exception utilisateur en PL/SQL ?
Comment fonctionne RAISE_APPLICATION_ERROR en PL/SQL ?
Quelle est la différence entre une exception utilisateur et une exception système en PL/SQL ?
Comment gérer la portée des exceptions en PL/SQL ?
Conclusion
En maîtrisant les exceptions utilisateur en PL/SQL, vous renforcez la robustesse de votre code. Quel autre aspect de la gestion des erreurs aimeriez-vous explorer pour optimiser encore plus vos applications ?