Exception
Transcription
Exception
Programmation Java : Les exceptions F. HAMOUDA 1 Plan du Cours • • • • • • • • • • • • • • • Gestion traditionnelle des erreurs Exceptions en JAVA La gestion des exceptions en JAVA Remarques sur TestExcep Exception Avantages et inconvénients Syntaxe de try/catch classe Throwable classe Exception classe Error Déclaration d’une exception Exécution Envoi d’une exception ou d’une erreur Exécution de Excep3 Quelques remarques sur les exceptions 2 Gestion traditionnelle des erreurs • modèle pour programme C chaque fonction retourne si ok ou non gestion à ma main de chaque erreur à l’endroit où elle se produit. . . problème supplémentaire : remontée dans le graphe d’appel ? bugs insolubles si non détection ! • code du programme normal mélangé avec traitement d’erreur résultat pas très lisible 3 La gestion des exceptions en JAVA • • • • exécution du code normalement en cas d’erreur, envoie une exception typée arrêt immédiat du traitement normal ! exécution d’un bloc spécifique de traitement d’erreur éventuellement hors de la routine ! remontée automatique dans le graphe d’appel • traitement des erreurs séparé. . .ou absent ! récupération et arrêt du programme • code plus propre, modèle similaire à C++ 4 import java.io.*; public class TestExcep { static public void main(String[] args) throws IOException { try { // optimiste, on y va ! FileReader reader = new FileReader(args[0]); System.out.println(reader.read()); } catch (FileNotFoundException e) { System.err.println("fichier pas trouve !"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("il manque un argument !"); } } } 5 shell> java TestExcep Makefile 35 shell> java TestExcep toto fichier pas trouve ! shell> java TestExcep il manque un argument ! 6 Remarques sur TestExcep • bloc try pour l’exécution normale • FileReader peut renvoyer FileNotFoundException c’est écrit dans la doc ! • .read() peut renvoyer IOException c’est aussi écrit dans la doc ! • args[0] peut renvoyer ArrayIndexOutOfBoundsException • si erreur : exécution du bloc catch englobant le plus proche associé au type de l’erreur (attention à l’héritage) 7 Exception • • • • il s’agit d’une instance d’une classe elle peut être attrapée dans un bloc try/catch on peut ajouter de nouvelles exceptions par héritage IOException FileNotFoundException Avantages et inconvénients • très propre • gestion explicite des erreurs à un seul niveau • déclaration des types d’erreur pouvant intervenir • mais code résultant un peu verbeux 8 Syntaxe de try/catch try { // code normal si tout va bien } catch (XyzException e) { // gestion de XyzException // avec son instance e } catch (ZwnException e) { // une autre exception // on en met autant qu’on veut... } finally { // facultatif / / dans tout les cas... } 9 classe Throwable • classe mère de toutes les exceptions et erreurs • méthodes courantes : – String getMessage(); – String toString(); – void printStackTrace(...); • étendue par Exception et Error 10 classe Exception • classe mère de toutes les exceptions • étend Throwable • peut être attrapée (catch) (et ses descendantes) • permet donc d’attraper toutes les exceptions ! • doit être déclarée par les fonctions et méthodes try { // ... } catch (Exception e) { // toutes les exceptions sont attrapées } 11 classe Error • • • • classe mère de toutes les erreurs Étend également Throwable ne doit pas être attrapée (terminaison du programme !) pas de déclaration nécessaire pour les fonctions 12 Déclaration d’une exception • une fonction ou méthode doit déclarer les exceptions • qu’elle envoie elle-même • qu’elle laisse passer ( émises par des fonctions appelées et non gérées en interne) • nécessaire au mécanisme de try/catch • avec le mot-clef throws en fin de déclaration • public void write() throws IOException, ...; 13 import java.io.*; public class Excep2 { static void traite(String nom) throws IOException { FileReader r = new FileReader(nom); System.out.println(r.read()); } static public void main(String[] args) { try { traite(args[0]); } catch (Exception e) { // attrape tout ! System.err.println("erreur : " + e); } } } 14 Exécution shell> java Excep2 colore_java.pl 35 shell> java Excep2 rien erreur : java.io.FileNotFoundException: rien (No such file or directory) shell> java Excep2 classes erreur : java.io.FileNotFoundException: classes (Is a directory) shell> java Excep2 erreur : java.lang.ArrayIndexOutOfBoundsException 15 Envoi d’une exception ou d’une erreur • throw expression ; • l’expression doit hériter de Throwable • générallement création de l’exception throw new Exception("un probleme"); • pour renvoyer une exception throw e.fillInStackTrace(); compl ète les informations portées par e 16 Exécution de Excep3 shell> java Excep3 4.0 ra = 2.0 shell> java Excep3 -1.0 erreur : PasDeSolution 17 Quelques remarques sur les exceptions • gestion des exceptions (bloc try ... catch ...) ou ignorées ! (simple déclaration ... throws ...) • compilateur très stricte sur les (re-)déclarations • pour des petits programmes, ajout au main. . . static public void main(String[] args) throws Exception { ... 18