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