except

publicité
Programmer avec les exceptions
en Java
Premier Cycle
Cours Eurinsa 2002
(c) P.Pollet
05/12/2002
Java 2001 (PP)
1
Plan
◆ Gestion traditionnelle des erreurs d ’exécution
◆ Qu’est-ce qu’une exception ?
◆ La classe Exception
◆ Les exceptions de l ’API Java
◆ Créer ses exceptions personnalisées
◆ L ’instruction throw
◆ Capture avec try…catch
◆ La clause finally
◆ Faire passer au niveau supérieur
◆ Que faut-il capturer ?
◆ Conclusion
05/12/2002
Java 2001 (PP)
2
Gestion traditionnelle des erreurs d ’exécution
◆ En programmation classique, la gestion des erreurs est
imbriquée dans le code.
Appel1 (…);
If Error then …. // traitement erreur(s)
◆ Exemple en Pascal :
else
Appel2(…);
if Error then // traitement erreurs(s)
else
◆ Problèmes:
…….
– Les erreurs peuvent être ignorées,oubliées...
– Le traitement des erreurs doit être répété à chaque appel d ’un « module »
susceptible de retourner un code d ’erreur.
– Non fiabilité du code puisque tout est laissé à la bonne volonté du
programmeur sans aucun contrôle du compilateur...
05/12/2002
Java 2001 (PP)
3
Qu’est-ce qu’une exception ?
◆ Lorsqu’une méthode détecte une situation d ’erreur elle
lève une exception, c’est à dire:
– elle interrompt son traitement.
– elle transmet (lance) à son appelant un « signal logiciel »
– ce signal logiciel est un objet (une instance de la classe Exception) qui
décrit entièrement le problème ( quoi, qui…)
– l ’appelé doit traiter (attraper) cette exception ou la transmettre au niveau
supérieur.
é Le traitement des erreurs peut donc être centralisé.
é Programmation de style « optimiste »
é On ne peut plus ignorer ou oublier les erreurs.
◆ Si une exception remonte jusqu’à la JVM:
– un diagnostic est affiché sur la console Java
– l ’exécution reprend si elle ne met pas en péril l ’environnement
05/12/2002
Java 2001 (PP)
4
La classe Exception
◆ Hérite de la classe java.lang.Throwable
◆ Principales méthodes:
– getMessage() : renvoie la chaîne de caractères passée au
constructeur de l ’exception, en principe le texte du message
d ’erreur
– toString() : renvoie une chaîne de caractères contenant le nom de
la classe et le résultat de getMessage()
• ex: « IOException : fichier non ouvert en écriture »
– printStackTrace() : imprime sur la console l ’ensemble des appels
parcourus par l ’exception.
05/12/2002
Java 2001 (PP)
5
Les exceptions de l ’API Java
◆ Toutes les classes de l ’API Java sont susceptibles de
lever des exceptions.
◆ Trois grandes catégories:
– les RuntimeException:
• Levées par la JVM lors des opérations de calcul courants
• Arithmétiques, tableaux, Pointeurs invalides...
• il n ’est pas nécessaire de les capturer. Le programme
sera alors interrompu automatiquement.
– les IOException:
• Levées par la JVM lors des opérations d ’entrées-sorties
• Fichiers, réseau...
– les InterruptedException:
• Levées quand une tâche endormie est réveillée.
05/12/2002
Java 2001 (PP)
6
Créer ses exceptions personnalisées
◆ Pourquoi le faire ?
– ajouter ses propres erreurs différentes de ceux de l ’API Java.
◆ Il suffit de sous-classer la classe Exception
◆ et de définir un constructeur (pour personnaliser le
message d ’erreur ) et peut-être la méthode toString().
class MonException extends Exception {
public MonException (String info)
super (info);
}
}
05/12/2002
Java 2001 (PP)
7
L ’instruction throw
◆ Cette instruction lance une exception et interrompt la
méthode en cours.
◆ Elle doit créer « à la volée » une instance de l ’exception
choisie via l ’opérateur new.
throw new IOException (« fichier introuvable »);
◆ Emission d ’une exception utilisateur:
throw new MonException (« la pile est vide !!! »);
05/12/2002
Java 2001 (PP)
8
Capture avec try…catch
◆ Le bloc try indique les instructions a surveiller
◆ Le ou les blocs catch les mesures à prendre
try {
// bloc pouvant lever ou recevoir des exceptions
}
catch ( IOException e) {
// que faire en cas de IOException ( ou ses sous-classes)
}
catch (Exception e) {
// que faire dans les autres cas
}
◆ En cas de « catch » l ’exécution continue après le dernier.
◆ Il peut arriver que certains blocs soit vides !
05/12/2002
Java 2001 (PP)
9
La clause finally
◆ Son exécution a lieu après un catch et toute rupture dans
le bloc try ( break, continue ou return) !
try {
}
catch ( IOException e) {
// que faire en cas de IOException ( ou ses sous-classes)
}
catch (Exception e) {
// que faire dans les autres cas
System.out.printeln (e.getMessage());
}
finally {
// toujours passer ici, quoiqu’il arrive !
}
05/12/2002
Java 2001 (PP)
10
Faire passer au niveau supérieur
◆
Ajouter à la déclaration de la méthode le mot throws suivi de la liste des classes
d’exception qu’elle émet ou transmet.
◆ Une méthode qui transmet d ’éventuelles exceptions d ’entrées sorties qu’elle
pourrait recevoir de la JVM n ’a donc pas besoin de try… except dans ses
méthodes
public maMethode () throws IOException {…..}
◆
Une méthode qui émet ( et transmet !) une exception utilisateur:
public maMethode2 () throws monException {
……
throw new monException (« problème ! »);
…..
}
}
05/12/2002
Java 2001 (PP)
11
Un exemple :
1
try {
ouvreConnexion(url );
….
}
catch (IOException e) {
……
}
catch (Exception e) {
5
}
finally {
…….
}
6
05/12/2002
void ouvre Connexion( URL url)
throws IOException{
……
litReponse ();
…..
4
}
3
2
void litReponse() throws IOException{
….
if (! ligne.equals(« OK »))
throw IOException (« aie »);
….
}
Java 2001 (PP)
12
Que faut-il capturer ?
◆ Il faut attraper (catch) ou transmettre (throws):
– Les exceptions normales émises par la JVM ( toutes sauf la
plupart des RuntimeException)
– Les RuntimeException d ’accès incorrect aux tableaux ou aux
objets (pointeur null) car elles indiquent une mauvaise
programmation et terminer dans ce cas au plus vite.
– Les exceptions d ’entrées-sorties (IOException ) et réagir au cas
par cas ( annuler, ré-essayer…).
– Les exceptions d ’interruption. Elles sont normales puis que
c ’est ainsi qu’un processus « endormi » signale son réveil.
– Les exceptions utilisateur, déclarées par une classe de
l ’application en cours !
05/12/2002
Java 2001 (PP)
13
Conclusion
◆ Le « devoir de capture » des exceptions est contrôlé par
le compilateur Java.
– Toute méthode de la JVM ou de l ’application qui est susceptible de lancer
(throw) des exceptions doit le signaler dans sa déclaration (throws).
– Toute méthode qui appelle une méthode qui « throws » une exception doit
la capturer (try… catch) ou la faire passer (throws).
◆ La gestion des erreurs est clairement séparée du code
« normal ».
◆ Les exceptions ne sont pas la panacée; elles révèlent
souvent une analyse incorrecte, ou un mauvais codage,
mais elles permettent un diagnostic plus rapide !
05/12/2002
Java 2001 (PP)
14
Téléchargement