Академический Документы
Профессиональный Документы
Культура Документы
En cas de problmes
envoyer un message derreur, sauvegarder lensemble du travail en cours, permettre une sortie correcte du programme, revenir en arrire et effectuer un autre traitement.
Comment faire
Solution : tout prvoir (tester lgalit zro du dnominateur avant une division, etc.) Problme : vous avez beau tre un bon programmeur vous ne pouvez pas tout contrler
que faire dans le cas dun mauvais type en entre, ou pour les cas non prvus par le programme ?
Introduction
Cest un vnement qui se dclenche pendant lexcution dun programme et qui perturbe le flux normal de lensemble des instructions. En Java, une exception est une instance de la classe Exception ou dune de ses sous-classes.
ISIGK
3. Appel dune mthode qui lve une exception 4. Lancement volontaire dune exception avec throw
ISIGK . Dr. Lassaad BAATI 6
Exception
Le mcanisme de gestion derreur le plus rpandu est celui des exceptions. Quand une erreur se dclenche dans une mthode, celle-ci cre un objet (exception object).
Cet objet contient les informations sur lerreur (type derreur, tat du programme cet instant, etc).
La cration dun objet exception et le fournir au runtime est appele throwing an exception .
ISIGK . Dr. Lassaad BAATI 7
Les exceptions
Constat :
mme si programme au point $ toujours des bugs !! grer tous les cas possibles peut alourdir la programmation
Dfinition
Dfinition : Le principe de l'exception est de capturer une erreur lorsqu'on suppose qu'elle peut intervenir dans une partie de code.
try { r= numrateur / dnominateur; } catch (Exception e) { //traitement de l'exception System.out.println("Exception: " + e); }
Dclenchement explicite
Il est possible de dclencher explicitement une exception (on dira qu'on lve une exception) dans un bloc catch.
try { if (denominateur==0) throw new Exception(); } catch (Exception e) { //traitement de l'exception System.out.println("Exception: " + e); throw e; }
Il est possible de dclencher explicitement une exception en dehors d'un bloc catch, il faut alors le dclarer au niveau de la signature de la mthode qui peut lever cette exception.
Exemple
Exemple Dfinition d'une classe permettant de calculer la racine carre d'un nb (dans ) nb 0 class sqrt { private r ; public sqrt (int x) throws ErrNeg { if (x<0) throw new ErrNeg() ; this.r = racinecarre(x); } }
Les exceptions
Passage de paramtres au gestionnaire d'exception : ... if (x<0) throw new ErrNeg(x) ; ... class ErrNeg extends Exception { ErrNeg(int a) {x =a ;} public int x ; } Poursuite de l'excution instruction System.exit() n'est pas obligatoire l'excution peut se poursuivre avec les instructions suivant le bloc try
Handle (capturer) la rponse de invoker lexception, appel catch en Java. Backtrack (retour diffrent de undo) Abilit dfiler la pile des frames partir do les exceptions ont t tendues, jusqu la 1ere position seine de la pile.
ISIGK . Dr. Lassaad BAATI 13
Programmes / Software
dfinie par le dveloppeur pour reprsenter un nouveau type derreur. Ces exceptions portent souvent sur la smantique.
Suivi / Monitor
Dcrit le statut dune opration en excution, cest un mcanisme pour la mise jour dexcution qui est plus simple que les subthreads.
ISIGK . Dr. Lassaad BAATI 14
Autres mcanismes
Renvoi dans les arguments
ISIGK
15
Lisibilit du code
Mlange traitement de donne/cas derreur
Erreur possiblement ignore par le dveloppeur surcharge du code destin au traitement normal cause des instructions traitant les exceptions qui lui sont entrelaces. Le but des mcanismes de traitement dexception intgres aux langages (Java, C++) est de
sparer clairement lcriture du code la partie traitement normal de la partie traitement des exceptions et de forcer le programmeur grer les exceptions gnres par les 16 mthodes quil utilise.ISIGK . Dr. Lassaad BAATI
Les exceptions peuvent oprer de faon asynchrone dans une methode 2 sous classes qui tendent throwable :
Exception, Error
Lexique
throws Permet d'indiquer que la mthode est suceptible de lever une exception throw Lever une exception au premier handler disponible dans la pile dappel. try marque le dbut du bloc contenant lensemble des exception
handlers.
catch si le bloc try gnre une exception de ce type, on bascule vers ce bloc, pour excuter les traitements adquats. finally appel quand le bloc try conclut, et aprs la fin du bloc catch.
ISIGK . Dr. Lassaad BAATI 18
Exceptions
2 familles dexceptions:
non fatales fatales (provoquent larrt du programme).
Throwable
Error
Exception
ThreadDeath
RuntimeException
IOException
NullPointerException
IllegalArgumentException
java.io.FileNotFoundException
ISIGK
20
Hirarchie RuntimeException
Exemples
ArithmeticException: une erreur arithmtique (division par 0) IndexOutofBoundsException: indice dun tableau est en dehors des bornes autorises.
Lappel dune mthode qui lance une exception (une mthode qui dclare quelle lance une exception) doit tre pris en compte dans le code appelant
Encapsuler lappel dans un bloc try/catch
Try {
Instruction 1; Instruction i; Instruction k;
Remarque: si le bloc try/catch a une instruction return finally sexcute quand mme Le flot saute finally puis revient return
Throws:
IOException - if an I/O error occurs.
Lesquiver
Il sagit de dclarer que vous lancez lexception mme si techniquement ce nest pas vous qui la lancez public class TaperTouche { static public void main(String[] args) throws IOException { System.out.println("Tapez une touche pour terminer le programme"); System.in.read(); } }
public class TaperTouche { static public void LireClavier throws IOException { System.out.println("Tapez une touche pour terminer le programme"); System.in.read(); } } Public class Main { static public void main(String[] args) throws IOException { TaperTouche.LireClavier(); }
Si Main nesquive pas lexception ou ne lencapsule pas dans un bloc try/catch il y a une erreur de compilation.
class MonZeroException extends Exception { public MonZeroException(String e){ super(e);} } public class laClauseThrows { public static void main (String[] args) { try{System.out.println("je verifie le nombre donne en argument."); LaClauseThrows.test(args); } catch (MonZeroException e){ System.out.println(e.getMessage()); // getMessage mthode de la classe Throwable // e.printStackTrace(); mthode de la classe Throwable affiche ltat de la pile dappels } } public static void test(String [] args) throws MonZeroException{ int n=Integer.parseInt(args[0]); if (n==0) throw new MonZeroException("jai vu un zero"); System.out.println("il ny a pas eu dexception pour zero"); } } }
public class TestExceptions { Exercice public static void main (String [] args) { String test = "non"; try { System.out.println("Dbut de try"); prendreRisque(test); System.out.println("Fin de try"); } catch (HorribleException he) { System.out.println("Horrible exception"); } finally { System.out.println("finally"); } System.out.println("fin de main"); } static void prendreRisque(String test) throws HorribleExeception { System.out.println("dbut de risque"); if ("oui".equals(test)) { throw new HorribleException(); } System.out.println("fin de risque"); return; } } Quel est le rsultat quand test vaut non et quand test vaut oui ?
Les blocs catch doivent tre ordonns du plus petit au plus grand
Cela dpend de la hirarchie dhritage
Syntaxe gnrale
public void setProperty(String p_strValue) throws NullPointerException { if (p_strValue == null) { throw new NullPointerException(...); } } //--------------------------------------------------public void myMethod() { MyClass oClass = new MyClass(); try { oClass.setProperty(foo); oClass.doSomeWork(); } catch (NullPointerException npe) { System.err.println(Unable to set property: +npe.toString()); } finally { oClass.cleanup(); } }
ISIGK . Dr. Lassaad BAATI 40
Lorsquune mthode est susceptible de lancer une exception ou de la propager, alors elle doit le specifier dans sa signature grce au mot-cl throws suivi de la liste des types dexception quelle lance ou propage.
float f(float x, y, z) throws ArithmeticException {
if( y + z == 0) throw new ArithmeticException(); return x / (y + z);
ISIGK
41
43
ISIGK
44
Les exceptions listes sont propages/transmises la mthode appelante si elles sont leves dans le corps de la mthode traite. Une exception peut tre propage jusqu' une mthode appelante qui la capture et la traite. Elle permet d'indiquer que la mthode est suceptible de lever une exception qu'elle ne capture pas par un try-catch ArithmeticException sera propage/transmise la mthode appelante si elle est leve. Donc il faut que les mthodes qui appelle la mthode solution
mettent ventuellement en place une mcanisme de capture try-catch ou qu'elles propagent elles aussi l'exception.
ISIGK . Dr. Lassaad BAATI 48
finally
Si une exception est lance dans un bloc try, ce sont ses blocs catch associs qui essaient dabord de la rceptionner. On peut rajouter un bloc finally { ... } aprs les blocs catch. Ce qui est dans le bloc finally sera excut quoi quil arrive :
soit aprs lexcution normale du bloc try, soit aprs lexcution dun bloc catch, soit juste avant que lon quitte la mthode cause dune exception lance mais non traite dans la mthode.
ISIGK
49
Exception
Erreurs grables (IOException, etc.)
RuntimeException
Erreurs ventuellement grables
(NullPointerException)
Les exceptions quon cre tendent lune des exceptions de ces groupes
ISIGK . Dr. Lassaad BAATI 50
Exceptions prdfinies
Il existe dj une hirarchie de classes hritant de la classe Exception. Cette classe (et donc toutes ses drives) contient deux constructeurs :
un constructeur sans paramtre et un constructeur prenant une chane en paramtre qui reprsente le texte explicitant lerreur.
La hirarchie RuntimeException
La classe RuntimeException hrite dException. Les classes suivantes hritent de RuntimeException :
ArithmeticException : erreur dans un calcul arithmtique, division par zro, ... IndexOutOfBoundsException : indice en dehors des limites dans un tableau) NullPointerException : appel dune mthode sur une variable ne rfrenant aucun objet ISIGK . Dr. Lassaad BAATI 52 ...
La hirarchie IOException
La classe IOException hrite aussi dException. Elle regroupe les exceptions rapportes aux traitements dentres-sorties. Ses sous-classes sont :
EOFException, FileNotFoundException, InterruptedIOException, MalformedURLException, ObjectStreamException, ...
ISIGK . Dr. Lassaad BAATI 53
Traiter lexception au niveau qui convient le mieux. Quand cest possible, rparer le problme correspondant lexception et rappeler la mthode o elle a eu lieu. (sinon arrter
le pgm)
Il existe des cas o lexception est partiellement traitable au niveau courant et partiellement des niveaux suprieurs.
Effectuer le traitement au niveau courant, puis relancer lexception (ou un autre type dexception) un niveau suprieur.
ISIGK . Dr. Lassaad BAATI 54
Exemple
public void foo() { try { /* marque le dbut du bloc try-catch */ int a[] = new int[2]; a[4] = 1; /* dclenche une exception dpassement de lindex */ } catch (ArrayIndexOutOfBoundsException e) { System.out.println("exception: " + e.getMessage()); e.printStackTrace(); } } /* Ce code peut etre compil mais gnre une exception en excution et dclenche larrt du programme */ public int[] bar() { int a[] = new int[2]; for (int x = 0; x <= 2; x++) { a[x] = 0; } return a; ISIGK . Dr. Lassaad BAATI }
55
tapes : trycatchfinally
Chaque bloc try doit avoir au moins un bloc catch ou un bloc finally attach. Si une exception est leve durant le bloc try :
Le reste du bloc try est ignor. Sil y a un bloc catch qui correspond lexception leve, il sera excut. Sil y a un bloc fnally, il sera aussi excut.
Conclusion
La gestion des exceptions permet de dissocier le programme principal de la gestion des erreurs, ou des arrts brusques du programme. Ce nest pas une nouvelle structure de contrle en plus des if, while, for, switch. La gestion des erreurs ralentit considrablement la vitesse du programme Les exceptions doivent rester exceptionnelles!