Sunteți pe pagina 1din 22

Traiter les exceptions

8-1 Copyright © Oracle Corporation, 2001. Tous droits réservés.


Objectifs

A la fin de ce chapitre, vous pourrez :


• définir des exceptions PL/SQL
• reconnaître les exceptions non traitées
• lister et utiliser les différents types de traitement
des exceptions PL/SQL
• intercepter les erreurs non prédéfinies
• décrire l'effet d'une propagation des exceptions
dans des blocs imbriqués
• personnaliser les messages d'erreurs PL/SQL

8-2
Traiter des exceptions en PL/SQL

• Une exception est un identificateur PL/SQL détecté


pendant la phase d'exécution.
• Comment est-elle déclenchée ?
– A la suite d'une erreur Oracle.
– Explicitement, par le programme.
• Comment la traiter ?
– En l'interceptant à l'aide d'un gestionnaire.
– En la propageant à l'environnement appelant.

8-3
Traiter des exceptions en PL/SQL
• Intercepter une exception
– Si une exception se déclenche dans la section exécutable
du bloc, le programme effectue un branchement sur le
gestionnaire d'exceptions correspondant dans la section de
traitement des exceptions du bloc. Si PL/SQL traite
convenablement l'exception, celle-ci n'est pas propagée au
bloc englobant ou à l'environnement appelant. Le bloc
PL/SQL s'exécute correctement.
• Propager une exception
– Si une exception se produit dans la section exécutable du
bloc et qu'il n'y a pas de gestionnaire d'exceptions
correspondant, le bloc PL/SQL aboutit à une erreur et
l'exception est propagée à l'environnement appelant.

8-4
Traiter les exceptions

Intercepter l'exception Propager l'exception

DECLARE DECLARE

BEGIN BEGIN
Exception Exception
déclenchée déclenchée
EXCEPTION EXCEPTION

Exception Exception
interceptée
END; END; non
interceptée
Exception propagée
à l'environnement
appelant

8-5
Types d'exception

• Exception prédéfinie du serveur Oracle Exception


• Exception non prédéfinie du serveur Oracle } déclenchée
implicitement

• Exception définie par l'utilisateur Exception déclenchée


explicitement

8-6
Intercepter les exceptions
Syntaxe :

EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
statement2;
. . .
[WHEN exception3 [OR exception4 . . .] THEN
statement1;
statement2;
. . .]
[WHEN OTHERS THEN
statement1;
statement2;
. . .]

8-7
Règles d'interception des exceptions

• Le mot-clé EXCEPTION débute la section de


traitement des exceptions.
• Plusieurs gestionnaires d'exceptions sont permis.
• Un seul gestionnaire d'exceptions est exécuté
avant de sortir du bloc.
• WHEN OTHERS est la dernière clause.

8-8
Intercepter les erreurs prédéfinies
du serveur Oracle

• Utiliser le nom standard à l'intérieur du


sous-programme de traitement des exceptions.
• Exemples d'exceptions prédéfinies :
– NO_DATA_FOUND
– TOO_MANY_ROWS
– INVALID_CURSOR
– ZERO_DIVIDE
– DUP_VAL_ON_INDEX

8-9
Exceptions prédéfinies

Syntaxe :
BEGIN
. . .
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;

WHEN TOO_MANY_ROWS THEN


statement1;
WHEN OTHERS THEN
statement1;
statement2;
statement3;
END;

8-10
Intercepter les erreurs non prédéfinies
du serveur Oracle

Déclarer Associer Référencer

Section déclarative Section de traitement


des exceptions

Nommer Coder PRAGMA Traiter l'exception


l'exception EXCEPTION_INIT déclenchée

la clause PRAGMA EXCEPTION_INIT indique au compilateur d'associer un nom


d'exception à un code d'erreur Oracle. Ainsi, vous pouvez faire référence à une
exception interne par son nom et lui associer un gestionnaire spécifique.
8-11
Erreur non prédéfinie
Intercepter une violation de contrainte d'intégrité
(code d'erreur du serveur Oracle –2292).

DEFINE p_deptno = 10 1
DECLARE
e_emps_remaining EXCEPTION;
2
PRAGMA EXCEPTION_INIT
(e_emps_remaining, -2292);
BEGIN
DELETE FROM departments
WHERE department_id = p_deptno;
COMMIT;
EXCEPTION
3
WHEN e_emps_remaining THEN
DBMS_OUTPUT.PUT_LINE ('Cannot remove dept ' ||
TO_CHAR(p_deptno) || '. Employees exist. ');
END;

8-12
Fonctions d'interception des exceptions

• SQLCODE : renvoie la valeur numérique du


code d'erreur
• SQLERRM : renvoie le message associé au
code d'erreur

8-13
Fonctions d'interception des exceptions

Exemple :
DECLARE
v_error_code NUMBER;
v_error_message VARCHAR2(255);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
v_error_code := SQLCODE ;
v_error_message := SQLERRM ;
INSERT INTO errors
VALUES(v_error_code, v_error_message);
END;

8-14
Intercepter les exceptions définies
par l'utilisateur

Déclarer Déclencher Référencer

Section Section Section de traitement


déclarative exécutable des exceptions

Nommer Déclencher explicitement Traiter l'exception


l'exception. l'exception par déclenchée.
l'instruction RAISE.

8-15
Exceptions définies par l'utilisateur
Exemple :
DEFINE p_department_desc = 'Information Technology '
DEFINE P_department_number = 300
DECLARE
e_invalid_department EXCEPTION; 1
BEGIN
UPDATE departments
SET department_name = '&p_department_desc'
WHERE department_id = &p_department_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_department; 2
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_department THEN 3
DBMS_OUTPUT.PUT_LINE('No such department id.');
END;

8-16
Environnements appelants

iSQL*Plus Affiche le code d'erreur et le message


à l'écran
Procedure Builder Affiche le code d'erreur et le message
à l'écran
Oracle Developer Accède au code et au message
Forms d'erreur d'un déclencheur (trigger) en
utilisant les fonctions de package
ERROR_CODE et ERROR_TEXT.
Application Accède au code d'erreur via une
précompilée structure de données

Bloc PL/SQL Intercepte les exceptions dans le


englobant sous-programme de traitement des
exceptions du bloc englobant

8-17
Propager des exceptions
DECLARE
. . .
e_no_rows exception;
e_integrity exception;
PRAGMA EXCEPTION_INIT (e_integrity, -2292);
BEGIN
FOR c_record IN emp_cursor LOOP
BEGIN
Des sous-blocs SELECT ...
UPDATE ...
peuvent traiter une IF SQL%NOTFOUND THEN
exception ou la RAISE e_no_rows;
END IF;
transmettre à un bloc END;
englobant. END LOOP;
EXCEPTION
WHEN e_integrity THEN ...
WHEN e_no_rows THEN ...
END;

8-18
Procédure RAISE_APPLICATION_ERROR

Syntaxe :
raise_application_error (error_number,
message[, {TRUE | FALSE}]);

• La procédure permet de délivrer des messages


d'erreur définis par l'utilisateur à partir de sous-
programmes stockés.
• Elle permet de signaler les erreurs à l'application
et d'éviter le renvoi d'exceptions non traitées.

8-19
Procédure RAISE_APPLICATION_ERROR

• Elle peut être utilisée à deux endroits :


– section exécutable
– section de traitement des exceptions
• Elle renvoie à l'utilisateur les conditions de l'erreur
de manière cohérente par rapport aux autres
erreurs du serveur Oracle

8-20
RAISE_APPLICATION_ERROR
Section exécutable :
BEGIN
...
DELETE FROM employees
WHERE manager_id = v_mgr;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20202,
'This is not a valid manager');
END IF;
...

Section de traitement des exceptions :


...
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20201,
'Manager is not a valid employee.');
END;

8-21
Synthèse

• Types d'exception :
– erreur prédéfinie du serveur Oracle
– erreur non prédéfinie du serveur Oracle
– erreur définie par l'utilisateur
• Intercepter une exception
• Traiter une exception :
– intercepter l'exception dans un bloc PL/SQL.
– propager l'exception.

8-22

S-ar putea să vă placă și