• Aucun résultat trouvé

cm04-gestiondeserreurs.pdf — March 15, 2005 — 1

N/A
N/A
Protected

Academic year: 2021

Partager "cm04-gestiondeserreurs.pdf — March 15, 2005 — 1"

Copied!
7
0
0

Texte intégral

(1)

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

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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

Références

Documents relatifs

À elle de voir si elle peut traiter cette exception, sinon on remonte de méthode en méthode à la recherche d'un bloc catch adéquat, jusqu'à terminer le programme (donc niveau

Lien entre une m´ethode et un type d’exception.- Comme d’habitude en Java, le lien doit ˆetre explicite entre une m´ethode dans laquelle on lance une exception et la

„ Le contenu d'une classe exception peut être vide, dans ce cas seul le nom de la classe importe.. „ Il peut aussi permettre s'il est non vide de gérer des informations sur

LIFO Une file est une liste où les insertions se font d'un côté et les suppressions se font de l'autre

- Sachant que Error est prédéfinie en Java, la déclaration suivante définit bien une nouvelle classe d’exception PasDefini :.. class PasDefini extends

Dans ce cas l’exception n’est pas rattrap´ee dans le corps et comme elle n’est ni dans la cat´egorie Error ni dans la cat´egorie RuntimeException, on la d´eclare comme

• Si l'instruction en faute est incluse dans un bloc try, le programme saute directement vers les gestionnaires d'exception qu'il examine séquentiellement dans l'ordre du code

public void setCouleur(String newCouleur) Fonction permettant de modifier la couleur du cercle courant, en gérant des exceptions de type NullPointerException si le paramètre