2I002
EXCEPTIONS
PERSONNALISÉES
Vincent Guigue
Exceptions
Uneexception est une rupture de calcul.
Elle est utilisée :
pour éviter les erreurs de calcul division par zéro
accès à la référencenull ouverture d’un fichier inexistant . . .
comme style de programmation
En Java une exception est un objet
Définir ses exceptions personnalisées Idée
Une exception est un objet... On peut définir ses propres exceptions
1 // E x c e p t i o n de b a s e p o u r t o u s l e s p r o b l e m e s de p i l e
2 p u b l i c c l a s s P i l e E x c e p t i o n e x t e n d s E x c e p t i o n {
3 p u b l i c P i l e E x c e p t i o n ( S t r i n g m e s s a g e ) {
4 s u p e r(" P r o b l e m e ␣ de ␣ p i l e ␣ : ␣ " + m e s s a g e ) ;
5 }
6 }
On peut même définir une hiérarchie d’exception:
1 // E x c e p t i o n s p e c i f i q u e p o u r l a p i l e p l e i n e
2 p u b l i c c l a s s P i l e P l e i n e E x c e p t i o n e x t e n d s P i l e E x c e p t i o n {
3 p u b l i c P i l e P l e i n e E x c e p t i o n ( ) {
4 s u p e r(" P i l e ␣ p l e i n e ") ;
5 }
6 }
Utile pour le transport d’informations (Attributs de l’exception personnalisée)
2i002 – Exceptions (2) 3/13
Récupération des interruptions avec des hiérarchies d’exceptions 1/3
+ Exception() + Exception(String s) +… [autres constructeurs]
Exception
+ PileException(String s) - infos sur la pile [OPT]
PileException
Une PileException EST UNE Exception... Le principe de subsomption s’applique.
1 t r y{
2 // P i l e p v i d e . . .
3 S y s t e m . o u t . p r i n t l n ( p . d e p i l e r ( ) ) ; // l e v e une P i l e E x c e p t i o n
4 }
5 }c a t c h( E x c e p t i o n e ) { // P i l e E x c e p t i o n e s t a t t r a p e e
6 // c a r c ’ e s t UNE E x c e p t i o n
7 . . .
8 }
Récupération des interruptions avec des hiérarchies d’exceptions 2/3
Possibilité de raffiner le traitement en fonction du type de l’exception
+ Exception() + Exception(String s) +… [autres constructeurs]
Exception
+ PileException(String s) - infos sur la pile [OPT]
PileException
Possibilité de faire plusieurs catch: traitement séquentiel, le premier qui correspond est utilisé (et les autres non)
1 t r y{
2 // P i l e p v i d e . . .
3 S y s t e m . o u t . p r i n t l n ( p . d e p i l e r ( ) ) ; // l e v e une P i l e E x c e p t i o n
4 }
5 }c a t c h(P i l e E x c e p t i o n e) { // P i l e E x c e p t i o n e s t a t t r a p e e i c i
6 . . .
7 }c a t c h(E x c e p t i o n e) { // On ne p a s s e p a s i c i
8 . . .
9 }
2i002 – Exceptions (2) 5/13
Récupération des interruptions avec des hiérarchies d’exceptions 3/3
+ Exception() + Exception(String s) +… [autres constructeurs]
Exception
+ PileException(String s) - infos sur la pile [OPT]
PileException
On définit obligatoirement les Exception les plus spécialisée en premier Sinon erreur de compilation Car code non accessible Le programme suivant ne compile pas...
1 t r y{
2 // P i l e p v i d e . . .
3 S y s t e m . o u t . p r i n t l n ( p . d e p i l e r ( ) ) ; // l e v e une P i l e E x c e p t i o n
4 }
5 }c a t c h( E x c e p t i o n e ) {
6 . . .
7 }c a t c h( P i l e E x c e p t i o n e ) { // Code non a c c e s s i b l e
8 . . .
9 }
Distinction entre Exception et RuntimeException
Les Exception susceptibles d’être levées dans une méthodedoivent être déclarée dans la signature de la méthode via le mot cléthrows.
Les RuntimeException sont des Exception particulières qui ne requièrent pas cette déclaration.
2i002 – Exceptions (2) 7/13
Déclaration d’une Exception
+ Exception() + Exception(String s) +… [autres constructeurs]
Exception
+ PileException(String s) - infos sur la pile [OPT]
PileException
Dans le cas d’un héritage à partir
d’Exception, la déclaration est obligatoire:
Sinon le code ne compile pas Signature de la méthode:
public <Retour> fonction(<args>) throws <typeException>
Sur un exemple:
1 p u b l i c v o i d e m p i l e r (i n t i t e m ) t h r o w s P i l e E x c e p t i o n{
2 i f( n i v e a u >=c a p a c i t e )
3 throw new P i l e E x c e p t i o n (" La ␣ p i l e ␣ e s t ␣ p l e i n e : ␣ i m p o s s i b l e ␣ d ’ a j o u t e r ␣ d e s ␣ e l e m e n t s ") ;
4 i t e m s [ n i v e a u ++] = i t e m ;
5 }
Cas particulier Attention
Si l’exception est traitée au niveau local, la fonction n’est pas susceptible de la lever : pas de déclaration dans ce cas.
1 // a v e c M o n E x c e p t i o n e x t e n d s E x c e p t i o n
2
3 p u b l i c v o i d m a F o n c t i o n ( Type a r g s ) { // p a s de d e c l a r a t i o n
4 . . .
5 t r y{
6 . . . // t r a i t e m e n t s
7 i f( t e s t )
8 throw new M o n E x c e p t i o n (" MonMessage ") ;
9 . . . // r e s t e d e s t r a i t e m e n t s
10 }c a t c h( M o n E x c e p t i o n e ) {
11 . . . // f a i r e qqch
12 }
13 }
Dans ce cas, il est impossible que maFonction soit interrompue par une MonException non traitée
2i002 – Exceptions (2) 9/13
Usage: méthode causant une interruption Idée (logique)
Si une méthodea utilise une méthode b susceptible de lever l’ExceptionExc, alorsa est susceptible de lever Exc également.
Vision linéaire du déroulement d'un programme
Fonction 1 Fonction 2
Exception levée main
1 Exception traitée dans Fonction2:
aucune déclaration nulle part
2 Exception traitée dans Fonction1 Fonction2 doit déclarerthrows MonException
Délégation du traitement Fonction1 ne déclare rien
3 Exception traitée dans main Les fonctions déclarentthrows NB: suivant les cas, on ne reprend pas
Cascade d’Exception
Une Exception peut déclencher d’autres Exception Mécanisme: Exception e →catch → Exception e2
Pour certains cas particuliers
Traduction d’exceptions générales vers les exceptions d’un projet particulier
1 p u b l i c v o i d m a F o n c t i o n t h r o w s D e p a s s e m e n t C a p a c i t e E x c e p t i o n {
2 t r y{
3 // g e s t i o n d ’ une s t r u c t u r e t a b u l a i r e de d o n n e e s
4 // r i s q u e de d e p a s s e m e n t d ’ i n d i c e
5 . . .
6 }c a t c h( I n d e x O u t O f B o u n d E x c e p t i o n e ) {
7 // t r a d u c t i o n d ’ une E x c e p t i o n J a v a s t a n d a r d
8 // −> E x c e p t i o n p e r s o
9 throw new D e p a s s e m e n t C a p a c i t e E x c e p t i o n ( ) ;
10 }
11 }
2i002 – Exceptions (2) 11/13
Assertion
Assertions en Java Idée
Simplifier la syntaxe des Exception Instructionassert
Syntaxe : assert expr1 [ : expr2 ] expr1 est une expression booléenne expr2 de type quelconque
Exécution :
expr1est évaluée
si false⇒uneAssertionErrorest lancée
expr2, convertie en chaîne, est utilisée comme message java.lang.Object
extended by java.lang.Throwable extended by java.lang.Error
extended by java.lang.AssertionError
Alternative avec des exceptions :
1 i f ( ! e x p r 1 ) {throw new M y E x c e p t i o n ( ) ; }
2i002 – Exceptions (2) 12/13
Utilisations [E. Chailloux]
1 i f ( x == 0 ) {
2 . . .
3 } e l s e { // x e s t e g a l a 1 . . .
4 a s s e r t x == 1 : x ;
5 }
6 . . .
7 s w i t c h( x ) {
8 c a s e −1 : r e t u r n INF ;
9 c a s e 0 : r e t u r n EGAL ;
10 c a s e 1 : r e t u r n SUP ;
11 d e f a u l t : a s s e r t f a l s e; // i m p o s s i b l e s i x=−1, 0 ou 1
12 }
13 . . .
14 p u b l i c i n t f f ( ) {
15 f o r ( . . . ) {
16 . . . r e t u r n . . . ;
17 }
18 // on ne p a s s e p a s i c i
19 a s s e r t f a l s e;
20 r e t u r n 0 ;
21 }