as
Architecture des Systèmes d’Information
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique
Programmation - Gestion des erreurs -
Nicolas Malandain
March 15, 2005
Gestion des erreurs 1 / 26
as
Architecture des Systèmes d’Information
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique
1
Pr´ esentation Principe Les exceptions
2
Les exceptions en Java Principe et Types Gestion et Syntaxe Exemple
3
Cr´ eation Principe Exemple
4
Pratique
Gestion des erreurs 2 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe Les exceptions
La gestion d’erreur
La gestion d’erreur devrait/doit :
obliger le d´ eveloppeur ` a prendre en compte les erreurs importantes proposer au d´ eveloppeur de cr´ eer son propre jeu d’erreurs
permettre au d´ eveloppeur de g´ erer proprement les erreurs
Gestion des erreurs 3 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe Les exceptions
Anciennes m´ ethodes
Principe du code de retour
Une fonction retourne une valeur (code) indiquant si elle s’est bien pass´ ee ou si il y a eu une erreur. Le code indique le type d’erreur.
Principe de la variable d’erreur globale
Une fonction, en cas d’erreur, affecte une valeur ` a une variable globale (exemple : errno en C).
Traitement des erreurs
Le traitement des erreurs est m´ elang´ e au code du programme
Gestion des erreurs 4 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe Les exceptions
Les exceptions
D´ efinition
Une exception est un ´ ev´ enement exceptionnel pouvant survenir lors de l’ex´ ecution d’un programme, celle-ci interrompt alors le d´ eroulement normale du programme pour entrer dans une branche de traitement.
Avantages des exceptions
1
s´ eparation du code et du traitement des erreurs
2
propagation des erreurs ` a travers la pile des appels
3
organisation des erreurs
Gestion des erreurs 5 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe Les exceptions
S´ eparation du code et du traitement des erreurs
Sans gestion des exceptions
TypeCodeErreur lireFichier() { TypeCodeErreur erreur = 0;
ouvrir le fichier;
if (fichier ouvert) { obtenir sa taille;
if (tailleObtenu) { allouer la m´emoire;
if (m´emoireDisponible) { charger le fichier en m´emoire;
if (erreurLecture) erreur = 1;
} else erreur = 2;
} else erreur = 4;
}
fermer le fichier;
if (le fichier ne se ferme pas) erreur = erreur and 8;
return erreur;
}
Avec gestion des exceptions
lireFichier() { try {
ouvrir le fichier;
obtenir sa taille;
allouer la m´emoire;
charger le fichier en memoire;
fermer le fichier;
} catch (OuvertureFichierEchec) { traiter l’erreur;
} catch(CalculTailleFichierEchec) { traiter l’erreur;
} catch (AllocationMemoireEchec) { traiter l’erreur;
} catch (LectureFichierEchec) { traiter l’erreur;
} catch (fileCloseFailed) { traiter l’erreur;
} }
Exemple modifi´e issu du tutoriel Java de Sun
Gestion des erreurs 6 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe Les exceptions
Propagation des erreurs
Sans gestion des exceptions
methode1() {
TypeCodeErreur erreur = methode2();
if (erreur) traiter erreur;
else
code de la methode;
}
TypeCodeErreur methode2() { TypeCodeErreur erreur;
erreur = methode3();
if (erreur) return erreur;
else
code de la methode;
}
TypeCodeErreur methode3() { TypeCodeErreur erreur;
erreur = lireFichier();
if (erreur) return erreur;
else
code de la methode;
}
Avec gestion des exceptions
methode1() { try {
methode2();
code de la methode;
} catch (exception) { traiter erreur;
} }
methode2() throws exception { methode3();
code de la methode;
}
methode3() throws exception { lireFichier();
code de la methode;
}
Exemple modifi´e issu du tutoriel Java de Sun
Gestion des erreurs 7 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe Les exceptions
Organisation des erreurs
Objectif
soit traiter diff´ eremment les types d’erreurs soit traiter de mani` ere identique toutes les erreurs
Gestion des erreurs 8 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe et Types Gestion et Syntaxe Exemple
Fonctionnement des Exceptions en Java
Principe
Lever une exception consiste ` a d´ erouter le flot d’instructions pour soit la propager , soit la traiter.
Si l’exception est propag´ ee au main alors le programme s’arrˆ ete et affiche des informations la caract´ erisant.
Informations associ´ ees ` a une exception lev´ ee le type de l’exception
Utile au d´ eveloppeur qui appellera une m´ ethode levant une exception,
le bon type permettra le bon traitement
le lieu de l’exception donn´ e par la pile des appels Utile au d´ ebogueur pour isoler/d´ eboguer le probl` eme un message caract´ erisant l’exception
Utile ` a l’utilisateur pour l’informer
Gestion des erreurs 9 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe et Types Gestion et Syntaxe Exemple
Hi´ erarchie
Les exceptions sont des classes
Exceptions non control´ ees java.lang.Error probl` eme de JVM ⇒ arrˆ et java.lang.RuntimeException gestion falcutative (ex: div / 0)
Exceptions control´ ees java.lang.Exception
propagation/traitement obligatoire
Deux m´ ethodes pratiques de Throwable void printStackTrace() String toString()
Gestion des erreurs 10 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe et Types Gestion et Syntaxe Exemple
Exemple d’ex´ ecution d’une exception non control´ ee
DivisionParZero.java
1 package fr.insarouen.asi.prog.cours4;
2 importjava.io.*;
3 public class DivisionParZero { 4 static int fct(inta,intb) {
5 returna/b;
6 }
7 public static voidmain(String[] param) {
8 int c;
9 c=fct(5,3);
10 System.out.println("c= "+c);
11 c=fct(3,0);
12 System.out.println("c= "+c);
13 }
14 }
Ex´ ecution
java -classpath ./classes fr.insarouen.asi.prog.cours4.DivisionParZero c= 1
Exception in thread "main" java.lang.ArithmeticException: / by zero
at fr.insarouen.asi.prog.cours4.DivisionParZero.fct(DivisionParZero.java:5) at fr.insarouen.asi.prog.cours4.DivisionParZero.main(DivisionParZero.java:11)
Gestion des erreurs 11 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe et Types Gestion et Syntaxe Exemple
Propager des exceptions
D´ efinition
Propager une exception consiste ` a renvoyer son traitement ` a la m´ ethode appelante.
Syntaxe
methode(...) throws Exception1, Exception2 { ...
// appel ` a une ou plusieurs m´ ethodes susceptibles de lever des // exceptions de classes Exception1, Exception2 (ou sous classes) // la clause throws fait partie de la signature de la m´ ethode ...
}
Remarque
En Java, toute exception non contrˆ ol´ e lev´ ee par une m´ ethode est implicitement propag´ ee.
Gestion des erreurs 12 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe et Types Gestion et Syntaxe Exemple
Attraper des exceptions (traitement)
D´ efinition
Attraper une exception consiste ` a d´ erouter le flot d’instructions vers une autre partie du programme permettant de la traiter (transfert de contrˆ ole).
Remarques
une seule clause catch ex´ ecut´ ee (la premi` ere qui matche) possibilit´ e d’attraper plusieurs exceptions en une seule clause avec une classe m` ere.
la clause finally facultative est toujours ex´ ecut´ ee Utilis´ e pour ex´ ecuter des op´ erations coute que coute ex: fermeture de fichiers, . . .
il est possible de m´ elanger propagation et traitement des exceptions
Gestion des erreurs 13 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe et Types Gestion et Syntaxe Exemple
Syntaxe
methode(...) { ...
try {
// appel `a une ou plusieurs m´ethodes susceptibles de lever des // exceptions de classes Exception1, Exception2 (ou sous classes) }
catch (Exception1 e) {
// Exception1 ne doit pas ^etre anc^etre de Exception2 }
catch (Exception2 e) { }
finally {
// code toujours ex´ecut´e exception ou pas }
...
}
Gestion des erreurs 14 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe et Types Gestion et Syntaxe Exemple
Lever des exceptions
D´ efinition
Lever une exception consiste ` a d´ erouter le flot d’instructions du programme pour la traiter ou la propager.
Syntaxe
methode(...) ... { ...
throw new UneException();
...
}
Gestion des erreurs 15 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe et Types Gestion et Syntaxe Exemple
TableauEntierNaturelDynamique.java
packagefr.insarouen.asi.prog.cours4;
public classTableauEntierNaturelDynamique { private int[] tab;
public TableauEntierNaturelDynamique(inttailledebase) { tab=new int[tailledebase];
}
public intgetEntier(intindice) { if (indice < 0 || indice >= tab.length)
throw newIndexOutOfBoundsException("indice non valide");
returntab[indice];
}
public voidsetEntier(intindice,intvaleur)
throwsIndexOutOfBoundsException, IllegalArgumentException { // runtime exception donc d´eclaration facultative if (valeur < 0)
throw newIllegalArgumentException("Entier < 0");
try {
tab[indice]=valeur;
}
catch(IndexOutOfBoundsException e) { if (indice < 0)
throw newIndexOutOfBoundsException("indice < 0");
int[] tabtmp=new int[indice+1];
System.arraycopy(tab, 0, tabtmp, 0, tab.length);
tabtmp[indice]=valeur;
tab=tabtmp;
} } ...
}
Gestion des erreurs 16 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe Exemple
Principes et Syntaxe
Utilisation
cr´ eer son propre syst` eme d’erreurs
traduire des exceptions de “trop bas niveau”
Syntaxe
Les exceptions sont des classes comme les autres. Les nouvelles exceptions doivent d´ eriv´ ees de Exception ou de RuntimeException
Gestion des erreurs 17 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe Exemple
Reprise du TableauEntierNaturelDynamique
La hi´ erarchie d’exceptions cr´ e´ ee
Gestion des erreurs 18 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe Exemple
TableauEntierNaturelDynamiqueException.java
packagefr.insarouen.asi.prog.cours4;
public class TableauEntierNonTrouveException
extends TableauEntierNaturelDynamiqueException { public TableauEntierNonTrouveException(String s) {
super(s);
}
public TableauEntierNonTrouveException() { }
}
TableauIndiceHorsBornesException.java
packagefr.insarouen.asi.prog.cours4;
public class TableauIndiceHorsBornesException
extends TableauEntierNaturelDynamiqueException { public TableauIndiceHorsBornesException(String s) {
super(s);
}
public TableauIndiceHorsBornesException() { }
}
. . .
Gestion des erreurs 19 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe Exemple
TableauEntierNaturelDynamiqueAvecException.java. . .
packagefr.insarouen.asi.prog.cours4;
public class TableauEntierNaturelDynamiqueAvecException { ...
public int getEntier(intindice)throwsTableauIndiceHorsBornesException { if (indice < 0 )
throw new TableauIndiceNegatifException("indice:"+indice+" < 0 interdit");
if (indice >= tab.length )
throw new TableauIndiceHorsBornesException("indice sup´erieur ou ´egal `a la borne sup´erieure");
returntab[indice];
}
public voidsetEntier(intindice,intvaleur)
throwsTableauEntierValeurNegativeException, TableauIndiceNegatifException { if (valeur < 0)
throw new TableauEntierValeurNegativeException(valeur+" < 0");
try {
tab[indice]=valeur;
}
catch(IndexOutOfBoundsException e) { if (indice < 0)
throw new TableauIndiceNegatifException(indice+" < 0");
int[] tabtmp=new int[indice+1];
System.arraycopy(tab, 0, tabtmp, 0, tab.length);
tabtmp[indice]=valeur;
tab=tabtmp;
} } ...
Gestion des erreurs 20 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique Principe Exemple
TableauEntierNaturelDynamiqueAvecException.java (suite)
public int chercherEntier(intvaleur)
throwsTableauEntierNonTrouveException, TableauEntierValeurNegativeException { if (valeur < 0)
throw new TableauEntierValeurNegativeException(valeur+" < 0");
if (tab.length == 0)
throw new TableauEntierVideException("Tableau vide");
for(inti=0; i<tab.length; i++) if (tab[i] == valeur )
returni;
throw new TableauEntierNonTrouveException(valeur+" non trouv´e");
}
public String toString() {
StringBuilder sb=newStringBuilder();
for(inti=0; i<tab.length; i++) { sb.append(tab[i]);
if (i!=tab.length-1) sb.append("/");
}
returnsb.toString();
} ...
Gestion des erreurs 21 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique
Coh´ erence
Ce qu’il faut faire
Le contenu d’un bloc try/catch doit ˆ etre “coh´ erent”
essayer de regrouper un ensemble d’instructions li´ ees
toujours traiter l’erreur dans le catch, cad pas de clause catch vide lors d’un throws toujours se mettre du point de vue de l’appelant (m´ ethode ou utilisateur) et non de celui de la classe.
quel exception peut il comprendre ? a-t-il la possibilit´ e de la traiter ? envoyer plus de 3 types d’exceptions n’est pas tr` es bon
la m´ ethode fait trop de choses → la d´ ecouper
le changement de signature est probl´ ematique → mettre ` a jour tout le code
bien sp´ ecifier d` es le d´ epart et/ou cr´ eer une hi´ erarchie d’exceptions et ne d´ eclarer que la classe m` ere dans le throws
Gestion des erreurs 22 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique
Probl` eme exception perdue
ExceptionPerdue.java
packagefr.insarouen.asi.prog.cours4;
public class ExceptionPerdue {
public static voidmain(String[] args)throwsException { MessageInTheBottle mp =new MessageInTheBottle();
try {
mp.lanceExceptionPerdue();
} finally {
mp.lanceExceptionQuiCache();
} } }
class MessageInTheBottle {
voidlanceExceptionPerdue()throwsPerdueException { throw new PerdueException();
}
voidlanceExceptionQuiCache() throwsQuiCacheException { throw new QuiCacheException();
} } ...
adapt´e de “Thinking in Java”
Gestion des erreurs 23 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique
Chaˆınage d’exceptions
Principe
Une exception lev´ ee est attrap´ ee puis aussitˆ ot une exception d’un autre type est lanc´ ee
Exemple d’utilisation
Une classe a besoin de charger une ressource quelconque
plusieurs possibilit´ es pour obtenir la ressource : BD, fichier, URL, . . .
donc plusieurs exceptions possibles : ⇒ SQLException, FileNotFoundException, MalformedURLException, ...
toutes attrap´ ees et lancement d’une exception commune Probl` eme : Perte de la cause initiale de l’exception
Solution : depuis le JDK 1.4 le chaˆınage d’exceptions est pris en compte dans Throwable
Gestion des erreurs 24 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique
Exemple de chaˆınage d’exceptions
VecteursNoms.java
packagefr.insarouen.asi.prog.cours4;
importjava.io.*;
importjava.net.*;
public class VecteurNoms {
public voidchargerNoms(File fichier)throwsChargementRessourceException { try {
FileReader reader =new FileReader(fichier);
// code }
catch(IOException e) {
throw new ChargementRessourceException("Probl`eme de chargement du fichier :"
+fichier,e);
} }
public voidchargerNoms(URL url)throwsChargementRessourceException { try {
URLConnection connection = url.openConnection();
Object obj = connection.getContent();
// code }
catch(IOException e) {
throw new ChargementRessourceException("Probl`eme de chargement de l’URL :"+url,e);
} } }
Gestion des erreurs 25 / 26
Plan Pr´esentation Les exceptions en Java Cr´eation Pratique
ExempleChainageException.java
packagefr.insarouen.asi.prog.cours4;
importjava.io.*;
importjava.net.*;
public class ExempleChainageException {
public static voidmain(String[] args)throwsException { VecteurNoms vn = newVecteurNoms();
vn.chargerNoms(new URL("http://asi.insa-rouen.fr/"));
vn.chargerNoms(new File("/tmp/unfichierquinexistepas"));
} }
R´ esultat
Exception in thread "main" fr.insarouen.asi.prog.cours4.ChargementRessourceException:
Probl`eme de chargement du fichier :/tmp/unfichierquinexistepas
at fr.insarouen.asi.prog.cours4.VecteurNoms.chargerNoms(VecteurNoms.java:14) at fr.insarouen.asi.prog.cours4.ExempleChainageException.main(
ExempleChainageException.java:12)
Caused by: java.io.FileNotFoundException: /tmp/unfichierquinexistepas (No suchfile or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106) at java.io.FileReader.<init>(FileReader.java:55)
at fr.insarouen.asi.prog.cours4.VecteurNoms.chargerNoms(VecteurNoms.java:10) ... 1 more
Gestion des erreurs 26 / 26