La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Exceptions IFT1025: Programmation 2 Jian-Yun Nie.

Présentations similaires


Présentation au sujet: "Exceptions IFT1025: Programmation 2 Jian-Yun Nie."— Transcription de la présentation:

1 Exceptions IFT1025: Programmation 2 Jian-Yun Nie

2 Concepts Erreur vs. Exception –Erreur: Un erreur logique impossible de réparer –Exception: un événement imprévu Laisser lexception sans traiter (échec du programme) Traiter lexception (le programme continue après le traitement) Traitement dexception –Un contrôle de sécurité Appel dune méthode dans de bonnes conditions ? Exécution de la méthode se déroule correctement ? … Sinon, quelles alternatives, correction ? –Mécanisme de traitement: général (classe) pour faciliter les traitements

3 Échec dun programme Impossibilité pour le système daccomplir une tâche 2 raisons déchec –Erreur logique dans limplantation (la faute du programmeur) –Impossibilité dobtenir des ressources nécessaires (e.g. fichier) Dans le cas derreur, pas réparable (seulement un message derreur) Mais pour la second classe: possible de traiter

4 Ressources nécessaires Matériel Système dexploitation Fichiers Réseau Base de données Utilisateur (interaction)

5 Exception Apparition dune situation anormale, détectable, qui conduit à léchec du programme Possibilité pour un programme de détecter et traiter certaines exceptions pour éviter léchec du programme

6 Exemple public class Lecture_mot { static BufferedReader input; public static void main(String[] args) { ouvrir_fichier("liste_mots"); traiter_fichier(); fermer_fichier(); } // ouverture du fichier public static void ouvrir_fichier(String nom) { try { input = new BufferedReader( new FileReader(nom)); } catch (IOException e) { System.err.println("Impossible d'ouvrir le fichier d'entree.\n" + e.toString()); System.exit(1); } } // ouvrir_fichier Si on utilise juste cette ligne, et que "liste_mots" nexiste pas - une exception non traitée, le programme échoue Possibilité de traiter lexception ici, e.g. demander à lutilisateur dentrer un autre fichier

7 Message dexception … catch (IOException e) { System.err.println("Impossible d'ouvrir le fichier d'entree.\n" + e.toString()); System.exit(1); } Message affiché: Impossible d'ouvrir le fichier d'entree. java.io.FileNotFoundException: liste_mots (No such file or directory)

8 Mécanisme général en Java Permet de détecter, signaler ou traiter une exception Non pour traiter des situations prévues Nest pas un mécanisme de contrôle pour le branchement dun programme (if, …) –Mais plutôt un autre mécanisme qui contrôle lexécution

9 Mécanisme général Exemples dexemption –Diviser par 0 –Accéder un tableau avec un index invalide Méthode qui appelle: … Appel … Méthode appelée: … Normal Exception appel Message dexception Suite normale Traiter lexception Retour normal

10 Mécanisme général Deux mécanismes en parallèle –Traitement normal –Traitement dexception (exception handler) Quand il y a une exception –Le traitement normal sarrête –Le traitement dexception prend le contrôle

11 Traitement dexception en chaîne méthode_1 appelle méthode_2, qui appelle méthode 3 Si méthode 3 génère une exception –Message dexception est envoyé à méthode_2 –Méthode_2 peut Traiter (attraper) lexception Relancer lexception: le message dexception sera envoyé à méthode_1 … Si une exception nest traitée par aucune méthode qui appelle: sortie du programme avec un message dexception Méthode_1Méthode_2Méthode_3

12 Exemple de transmission dexception

13 Générer une exception Certaines exceptions standard sont reconnues –ArithmeticException: diviser par 0 –ClassCastException: Casting dun objet à une mauvaise classe –EOFException: Lire après la fin dun fichier –IllegalArgumentException: paramètres illégaux ou inappropriés –… Quand une de ces exceptions est rencontrée, le système lance (throw) un message dexception

14 Hiérarchie des classes dexceptions

15

16 Attraper (catch) une exception Attraper une exception pour la traiter try { statements : } catch ( ExceptionClass1 object) { statements : } catch (ExceptionClass2 object) { statements : } … Bloc où une exception peut se générer Blocs pour attraper les exceptions

17 Exemple public static void ouvrir_fichier(String nom) { try { input = new BufferedReader( new FileReader(nom)); } catch (IOException e) { System.err.println("Impossible d'ouvrir le fichier d'entree.\n" + e.toString()); System.exit(1); }

18 Un autre exemple public void getSomeData () throws FileNotFoundException, SecurityException { FileReader in; boolean success = false; //Data file opened int tryNumber = 0; //# of attempts to open datafile int delay = 5 * 1000; //wait in milli secs while (!success) try { tryNumber = tryNumber + 1; in = new FileReader(DataFile); success = true; … } catch (SecurityException e) { if (tryNumber == 1) thisThread.sleep(delay); else throw e; }

19 Exécution avec catch Si aucune exception est générée (thrown), les instructions dans catch ne sont pas exécutées Si une exception est générée, lexception est comparée dans lordre avec les clauses de catch (ExceptionClass object) –Si la classe de lexception match celle de catch: exécution des instruction de ce catch, continue après le dernier catch (sauter les autres catches) –Seulement le premier catch compatible avec lexception est exécuté Important: Catch dabord les sous-classes dexception –Si aucun catch est compatible avec lexception, lexception nest pas attrapée (non traitée) transmise à la méthode qui appelle

20 Checked vs. Unchecked Checked exception –Vérifiée par le compilateur –Si le programme peut générer une telle exception, il doit Soit la traiter dans le programme Soit la retransmettre à lappelant (avec throws dans lentête) –Typiquement générée à cause de lenvironnement –Exemple, IOException –public void getSomeData () throws FileNotFoundException, SecurityException Unchecked exception –RuntimeException –Problème du programmeur (mauvaise utilisation dune méthode, dun objet, …) –Le compilateur ne la vérifie pas –Si un programme peut générer une telle exception, le programme na pas à la signaler dans lentête –public int division(înt a, int b) {return a/b; }

21 Checked vs. Unchecked exception

22 Lancer une checked exception Signaler au compilateur quune méthode peut lancer une exception (non attrapée, non traitée) public void methode() throws ExceptionClass Exemple public void skip () throws IOException { String s; s = input.readLine(); } Si une exception apparaît, transmise à lappelant (caller)

23 Traitement partiel dexceptions public void getSomeData () throws FileNotFoundException, SecurityException{ FileReader in; try { in = new FileReader (DataFile); … } catch (FileNotFoundException e) { //cleanup throw e; // throws it again to its caller } } catch (SecurityException e) { //cleanup throw e; // throws it again to its caller }

24 finally Exécuter un bloc quel que soit lexception try { statement... } finally { statement... } Exécuter finally même si le bloc try lance ne exception

25 finally Souvent combiné avec catch try { statement... } catch (ExceptionClass exceptionObject) { statement... } finally { statement... } Même si une exception est attrapée, finally sera toujours exécuté Utile pour sassurer de certaine sécurité (cleanup)

26 Générer une exception explicitement Un programme peut aussi générer une exception public class BankAccount throws IllegalArgumentException { public void withdraw(double amount) { if (amount > balance) { IllegalArgumentException exception = new IllegalArgumentException("Amount exceeds balance"); throw exception; } balance = balance - amount; }... } Général: throw exceptionObject; Forcer la méthode qui appelle de traiter cette exception

27 Définir ses propres exceptions Les classes dexception prédéfinies ne sont pas suffisamment explicites On a besoin de faire la différence entre les exceptions pour leurs traitements Définir une sous-classe dexception public class NoDataException extends Exception { public NoDataException () { super(); } public NoDataException (String s) { super(s); } Définir une hiérarchies de classes dexception constructeurs

28 Un autre exemple class TemperatureException extends Exception { } class TooColdException extends TemperatureException { } class TooHotException extends TemperatureException { }

29 Classe Exception Constructeurs Exception() Constructs a new exception with null as its detail message. Exception(String message) Constructs a new exception with the specified detail message. Exception(String message, Throwable cause) Constructs a new exception with the specified detail message and cause. Exception(Throwable cause) Constructs a new exception with the specified cause and a detail message of (cause==null ? null : cause.toString()) (which typically contains the class and detail message of cause).

30 Classe Throwable 4 constructeurs Throwable getCause() –Cause de cette exception (ou null) String getMessage(): –message envoyé par lexception String toString() –Générer un message décrivant lexception …

31 Penser Exception comme des classes / sous-classes Une TooColdException est aussi une TempretureException, Exception, Throwable Attention aux catches: Catch une sous-classe avant une super-classe

32 Prévenir des erreurs Certaines erreurs peuvent être détectées ou éviter Tester la pré-conditon, post-condition ou linvariant dune méthode –Pré-condition: condition sous laquelle on lappelle –Post-condition: condition après la méthode –Invariant: conditions devant être vérifiée tout au long Test sur pré-condition : facile (assert) Test sur post-condition et invariant : plus difficile

33 assert assert booleanExpression ; assert booleanExpression : expression Si la condition non satisfaite, AssertionError Exemple //Interchange list.get(i) and list.get(j) // require 0 <= i, j < list.size() … private void interchange ( List list, int i, int j) { assert 0 <= i && i < list.size(): "precondition: illegal i"; assert 0 <= j && j < list.size(): "precondition: illegal j"; …

34 Alternative (public) //Interchange list.get(i) and list.get(j) // require 0 <= i, j < list.size() … public void interchange ( List list, int i, int j) { if (0 <= i && i < list.size()) throw new IndexOutOfBoundsException("illegal i); if (0 <= j && j < list.size()) throw new IndexOutOfBoundsException("illegal j); …

35 Convention Méthode utilitaire private: assert Méthode public: exception –Pourquoi pas dassert pour tester les paramètres ? Ce test ne correspondent pas à la spécification de la méthode public Ne permettrait pas de générer un message dexception approprié Activer/Désactiver assertion: –Javac -enableassertions … –Javac -disableassertions …

36 Méthode private ou public Méthodes public: –Comportement observable de lextérieur –défini par une spécification Méthode private –Méthode utilitaire pour faire un traitement interne –Nest pas directement visible de lextérieur –Non définie par une spécification

37 Exemple Définir une méthode qui fait retourne le plus petite valeur dun tableau –Spécification: Accepter un tableau de nombres entiers Retourner la plus petite valeur stockée Cas spécial - tableau vide: un message dexception –Entête public int plusPetit(int [] a)

38 Implantation public int plusPetit(int [] a) { … return pp(a, 0); } private int pp(int [] a, int ind) { … int p = pp(a, ind+1); if (p>a[ind]) return a[ind] else return p; } Utiliser Exception Utiliser Assert


Télécharger ppt "Exceptions IFT1025: Programmation 2 Jian-Yun Nie."

Présentations similaires


Annonces Google