P6 Exceptions
P6 Exceptions
Exceptions Exceptions
⚫ mécanisme utilisé très fréquemment dans le langage Java
⚫ les exceptions sont rencontrées dans de nombreuses situations dans la signature de méthodes et la documentation des
classes. Certaines exécutions peuvent faire apparaître (lever) des exceptions
Les Exceptions C:>java throwtest 3
i = 3
[Link]
ion: 3 at
throwtest.b([Link]
) at
throwtest.a([Link]
)
at [Link]([Link])
POO en Java 2
1
26/05/2025
2
26/05/2025
3
26/05/2025
Throwable "Because all exceptions that are thrown within a Java program
contient un message d'erreur décrivant l'exception are first-class objects, grouping or categorization of exceptions
String message
Permet le «chaînage»
Throwable cause
is a natural outcome of the class hierarchy. Java exceptions
des exceptions
must be instances of Throwable or any Throwable descendant.
Throwable() constructeurs (sans et avec message d ’erreur)
Throwable(String message)
As for other Java classes, you can create subclasses of the
Throwable(Throwable cause)
Throwable class and subclasses of your subclasses.
Throwable (String message, Each "leaf" class (a class with no subclasses) represents
Throwable cause) a specific type of exception and each "node" class (a class with
renvoie le message d'erreur décrivant l'exception one or more subclasses) represents a group of
String getMessage()
void printStackTrace()
related exceptions. "
affiche sur la sortie erreur standard la liste des appels de
Throwable getCause() méthodes ayant conduit à l'exception (backtrace).
[The Java Tutorial, Campione &Walrath 97]
4
26/05/2025
Exception
En langage C En Java
class CompteException extends Exception {
#define EOF_ERROR 1
private int noCompte;
#define FILENOTFOUND_ERROR 2 Exception public CompteException(int c, String mess)
#define ZIP_ERROR 3 CompteException
{ super(mess);noCompte = c;
} int noCompte
public int noCompte() { return noCompte; CompteException(c : int, mess :String)
Niveau d'abstraction qui }} getNoCompte() : int
IOException permet de désigner toutes
les exceptions liées au E/S
5
26/05/2025
try {
⚫ un seul bloc catch peut être exécuté : le premier suceptible "d'attraper" l'exception.
String nomFichier;
String[] lireTexte(String nomfic){
...
⚫ chaque clause catch doit être déclarée avec un argument de type Throwable ou une sous-classe de
[Link]("nom fichier :");
nomFichier = [Link](); ... Throwable
FileReader f= new FileReader(
String[] text=lireTexte(nomFichier);
for (int i = 0; i < [Link]; i++) {
new File(nomfic)); ⚫ quand une exception est levée dans le bloc try, la première clause catch dont le type de l'argument
...
}
[Link](text[i]);
...
Le fichier correspond à celui de l'exception levée est invoquée
... n'existe pas !
...
return ... ; création d’un objet FileNotFoundException ⚫ clause catch dont l'argument est de même classe que l'exception levée,
} et arrêt de l‘exécution normale
} ⚫ clause catch dont l'argument est une super-classe de la classe de l'exception levée.
catch (FileNotFoundException e) {
[Link]();
[Link]([Link]());
... Traitement local de l’erreur ⚫ l'ordre des blocs catch est donc très important.
}
...
... Poursuite de l ’exécution
POO en Java
11 POO en Java 12
6
26/05/2025
... ...
try {
Exception de type : Except1 try {
// séquence de code pouvant lever
Exception ou Except2 ou Except3 // séquence de code pouvant lever Exception
Exception de type Except1 //des exceptions de type Except1,
//des exceptions de type Except1,
// Except2 ou Except3
// Except2 ou Except3
...
...
}
}
? catch (Except2 ex) {
Except1 quel bloc catch va la catch (Except2 ex) { Except
Except1
1 // e1 est l'exception qui a été levée
traiter ? // e1 est l'exception qui a été levée // dans le bloc try
//dans le bloc try Types ne
[Link]([Link]()); [Link]([Link]());
? correspondent pas, on
[Link](); [Link]();
passe au bloc catch // ...
Except2 // ... Except2 suivant
}
? catch (Except1 ex) {
catch (Except1 ex) { Types //
// ... correspondent } ...
} exécution du bloc
catch catch (Except3 ex) {
Except3 catch (Except3 ex) { Except3
// ...
// ... les blocs catch
}
} suivants sont ignorés
et poursuite de ...
l’exécution
7
26/05/2025
... ...
try { L ’ordredes blocs try {
Exception Exception catch doit respecter
Exception de type Except3 // séquence de code pouvant lever l’ordreinversede l'ordre // séquence de code pouvant lever
//des exceptions de type Except1, d’héritage entre les //des exceptions de type Except1,
// Except2 ou Except3
classes d’exception
... ...
} }
? catch (Except2 ex) { catch (Except3
catch (Except2 ex)
ex) {
{
Except1 // e1 est l'exception qui a été levée Except1 //...
e1 est l'exception qui a été levée
//
Types correspondent un // dans le bloc try // dans le bloc try
}
objet Except3 est un [Link]([Link]()); [Link]([Link]());
objet Except2 [Link](); [Link]();
catch (Except2 ex) {
// ... // ...
// e1 est l'exception qui a été levée
} } // dans le bloc try
Except2 Except2
[Link]([Link]());
catch (Except1 ex) { catch (Except1 ex) {
[Link]();
// ... //
//...
...
} }
}
catch (Except3 ex) { catch (Except1
catch (Except3 ex)
ex) {
{
Except3 le bloc catch Except3 Except3
// ... // ...
// ...
ne peut jamais être atteint } }
P:\Java\Tests\>javac [Link] }
d’ailleurs le compilateur ... [Link]: catch not reached ...
catch (Except3 e3) { ...
le signale
^
1 error
POO en Java 15 POO en Java 16
8
26/05/2025
9
26/05/2025
POO en Java
POO en Java 19 20
10
26/05/2025
POO en Java 21
17 POO en Java 22
11
26/05/2025
class MonException extends Exception { public class TestExcep { class MonException extends Exception { public class TestExcep {
public MonException() { public void method1() throws MonException { public MonException() { public void method1() throws MonException {
super(); throw (new MonException()); super(); throw (new MonException());
} } } }
public MonException(String s) { public void method2() { public MonException(String s) { public void method2() {
super(s); method1(); super(s); method1();
} } } }
} }
} }
12
26/05/2025
⚫ plusieurs classes d ’exceptions peuvent être indiquées dans la clause throws d’une déclaration de méthode ⚫ la classeutilisée pour les exceptions dans la clause throws peut être une superclasse de la classe de
l'exception effectivement lancée
13
26/05/2025
void methodeX() throws Except1, Except4 { void methodeX() throws Except1, Except4 {
Except1 Except4 Except5 // séquence de code pouvant Except1 Except4 Except5 // séquence de code pouvant
// lever des exceptions // lever des exceptions
// de type Except1, // de type Except1,
Except2 // ou Except4 Except2 // ou Except4
... ...
Except3 } }
Except3
... ...
} }
Lorsque l'on redéfinit la Mais alors, la méthode redéfinie
méthode peut-on lancer de doit-elle avoir nécessairement la La clause throws peut être "spécialisée"
nouveaux types d'exception ? même clause throws ? (typage covariant de la clause throws)
public Class B extends A { public Class B extends A {
Pas
NON !
void methodeX() throws Except1, Except4 , Except5 { void methodeX() throws Except1
Except3,, Except4 {
[Link](); ...
... nécessairement ! ...
// séquence de code pouvant lever une // séquence de code pouvant lever une
// exception de type Except5 // exception de type Except3 ou Except4
⚫ La méthode redéfinie doit respecter le contrat ... ...
défini par la méthode originale. Elle ne peut } ⚫ La méthode redéfinie peut lancer des exceptions } public Class C extends A {
... ... void methodX() {
rajouter de nouveaux types d'exception } spécialisant les exceptions définies dans la clause } // séquence de code ne levant
// pas d'exception
throws de la méthode originale ...
}
...
}
14
26/05/2025
⚫ poursimplifier écriture des programmes (et permettre une extensibilité future) les
exceptions "standards" non pas besoin d'être déclarées LinkageError RunTimeException IOException
15
26/05/2025
16
26/05/2025
17
26/05/2025
method1() { method1() { method1( { ⚫ Java ajoute quelques nouveautés au langage Java pour faciliter la gestion des exceptions
int error = method2(); method2(); try {
if (error) proceed1(); method2();
doErrorProcessing(); } proceed1()
else } catch (Exception ex) { ⚫ récupération de plusieurs types d'exception dans un même bloc catch
proceed1(); method2 { doErrorProcessing();
} method3(); } ⚫ évite d'avoir à répéter des blocs catchs identiques pour des
}
int method2() { }
proceed2(); exceptions de types différents
int error = method3(); method2() throws Exception {
if (error) method3 { method3();
return error; proceed2();
else
readFile();
} ⚫ instruction "try-with-resources"
}
proceed2();
} seule method1 intéressée method3() throws Exception { ⚫ évite d'avoir un bloc finally pour la fermeture des ressources
par les erreurs pouvant readFile();
int method3() { intervenir dans readFile }
return readFile();
}
propagation automatique dans
on est contraint de forcer method2 et la pile des appels, seules les
method3 à propager les codes méthodes qui se soucient
d'erreur retournés par readFile des erreurs ont à les détecter
POO en Java 35 POO en Java 36
18
26/05/2025
Exceptions At t raper plusieurs types d’exc ept ions Exceptions Ins truc tio n t r y av ec res s ourc es
⚫ Ressources : un objet qui doit être explicitement fermé lorsque le programme en a fini avec lui.
⚫ Exemples: fichier, connexion réseau…
⚫ Un simple bloc catch peut servir à gérer plusieurs types d’exception
⚫ Si l’utilisation des ressources peut provoquer des exceptions il faut soit
⚫ Réduit la duplication de code et diminue la tentation d'attraper une exception à l’aide d’un type trop
⚫ s’assurer explicitement de leur fermeture avec des clause finally
général. ⚫ déclarer la ou les ressources dans l’instruction try , la fermeture des ressources sera alors effectuée implicitement.
19
26/05/2025
String query =
"select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES"; ⚫ lecode pour gérer les erreurs peut être regroupé en un seul endroit : là où on a besoin de
try ( Statement stmt = [Link]();
ResultSet rs = [Link](query) ) }
traiter l'erreur
while ([Link]()) {
String coffeeName = [Link]("COF_NAME");
int supplierID = [Link]("SUP_ID"); ⚫ possibilité de
se concentrer sur l'algorithme plutôt que de s'inquiéter à chaque instruction
try avec ressources
float price = [Link]("PRICE");
int sales = [Link]("SALES"); rs et stmt sont fermées de ce qui peut mal fonctionner,
int total = [Link]("TOTAL"); explicitement quoi qu'il
[Link](coffeeName + ", " + supplierID + ", " + price + arrive (exception ou pas)
", " + sales + ", " + total);
} ⚫ leserreurs remontent la hiérarchie d'appels grâce à l'exécutif du langage et non plus grâce
} à la bonne volonté des programmeurs.
catch (SQLException e) {
[Link](e); clause catch exécutée en
} cas de SQLException
}
Dans une instruction try avec resources les blocs catch et/ou finally sont exécutés après que les ressources
déclarées aient été implicitement fermées.
POO en Java 39 POO en Java 40
20