Exceptions IFT 1025 Programmation 2 JianYun Nie Concepts
- Slides: 38
Exceptions IFT 1025: Programmation 2 Jian-Yun Nie
Concepts • Erreur vs. Exception – Erreur: Un erreur logique impossible de réparer – Exception: un événement imprévu • Laisser l’exception sans traiter (échec du programme) • Traiter l’exception (le programme continue après le traitement) • Traitement d’exception – Un contrôle de sécurité • • Appel d’une 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
Échec d’un programme • Impossibilité pour le système d’accomplir une tâche • 2 raisons d’échec – Erreur logique dans l’implantation (la faute du programmeur) – Impossibilité d’obtenir des ressources nécessaires (e. g. fichier) • Dans le cas d’erreur, pas réparable (seulement un message d’erreur) • Mais pour la second classe: possible de traiter
Ressources nécessaires • • • Matériel Système d’exploitation Fichiers Réseau Base de données Utilisateur (interaction)
Exception • Apparition d’une 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
Exemple public class Lecture_mot { static Buffered. Reader input; public static void main(String[] args) { ouvrir_fichier("liste_mots"); traiter_fichier(); fermer_fichier(); } Si on utilise juste cette ligne, et que "liste_mots" n’existe pas - une exception non traitée, le programme échoue // ouverture du fichier public static void ouvrir_fichier(String nom) { try { input = new Buffered. Reader( new File. Reader(nom)); } catch (IOException e) { System. err. println("Impossible d'ouvrir le fichier d'entree. n" + e. to. String()); System. exit(1); } } // ouvrir_fichier Possibilité de traiter l’exception ici, e. g. demander à l’utilisateur d’entrer un autre fichier
Message d’exception … catch (IOException e) { System. err. println("Impossible d'ouvrir le fichier d'entree. n" + e. to. String()); System. exit(1); } Message affiché: Impossible d'ouvrir le fichier d'entree. java. io. File. Not. Found. Exception: liste_mots (No such file or directory)
Mécanisme général en Java • Permet de détecter, signaler ou traiter une exception • Non pour traiter des situations prévues • N’est pas un mécanisme de contrôle pour le branchement d’un programme (if, …) – Mais plutôt un autre mécanisme qui contrôle l’exécution
Mécanisme général • Exemples d’exemption – Diviser par 0 – Accéder un tableau avec un index invalide Méthode qui appelle: … appel Appel Méthode appelée: … Retour normal Suite normale Traiter l’exception … Normal Exception Message d’exception
Mécanisme général • Deux mécanismes en parallèle – Traitement normal – Traitement d’exception (exception handler) • Quand il y a une exception – Le traitement normal s’arrête – Le traitement d’exception prend le contrôle
Traitement d’exception en chaîne • méthode_1 appelle méthode_2, qui appelle méthode 3 Méthode_1 Méthode_2 Méthode_3 • Si méthode 3 génère une exception – Message d’exception est envoyé à méthode_2 – Méthode_2 peut • Traiter (attraper) l’exception • Relancer l’exception: le message d’exception sera envoyé à méthode_1 • … • Si une exception n’est traitée par aucune méthode qui appelle: sortie du programme avec un message d’exception
Exemple de transmission d’exception
Générer une exception • Certaines exceptions standard sont reconnues – Arithmetic. Exception: diviser par 0 – Class. Cast. Exception: Casting d’un objet à une mauvaise classe – EOFException: Lire après la fin d’un fichier – Illegal. Argument. Exception: paramètres illégaux ou inappropriés –… • Quand une de ces exceptions est rencontrée, le système lance (throw) un message d’exception
Hiérarchie des classes d’exceptions
Attraper (catch) une exception • Attraper une exception pour la traiter try { statements : : } catch ( Exception. Class 1 object) { statements : : } catch (Exception. Class 2 object) { statements : : }… Bloc où une exception peut se générer Blocs pour attraper les exceptions
Exemple public static void ouvrir_fichier(String nom) { try { input = new Buffered. Reader( new File. Reader(nom)); } catch (IOException e) { System. err. println("Impossible d'ouvrir le fichier d'entree. n" + e. to. String()); System. exit(1); } }
Un autre exemple public void get. Some. Data () throws File. Not. Found. Exception, Security. Exception { File. Reader in; boolean success = false; //Data file opened int try. Number = 0; //# of attempts to open datafile int delay = 5 * 1000; //wait in milli secs while (!success) try { try. Number = try. Number + 1; in = new File. Reader(“Data. File”); success = true; … } catch (Security. Exception e) { if (try. Number == 1) this. Thread. sleep(delay); else throw e; } }
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, l’exception est comparée dans l’ordre avec les clauses de catch (Exception. Class object) – Si la classe de l’exception 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 l’exception est exécuté • Important: Catch d’abord les sous-classes d’exception – Si aucun catch est compatible avec l’exception, • l’exception n’est pas attrapée (non traitée) • transmise à la méthode qui appelle
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 à l’appelant (avec throws dans l’entête) – Typiquement générée à cause de l’environnement – Exemple, IOException – public void get. Some. Data () throws File. Not. Found. Exception, Security. Exception • Unchecked exception – Runtime. Exception – Problème du programmeur (mauvaise utilisation d’une méthode, d’un objet, …) – Le compilateur ne la vérifie pas – Si un programme peut générer une telle exception, le programme n’a pas à la signaler dans l’entête – public int division(înt a, int b) {return a/b; }
Checked vs. Unchecked exception
Lancer une checked exception • Signaler au compilateur qu’une méthode peut lancer une exception (non attrapée, non traitée) public void methode() throws Exception. Class • Exemple public void skip () throws IOException { String s; s = input. read. Line(); } • Si une exception apparaît, transmise à l’appelant (caller)
Traitement partiel d’exceptions public void get. Some. Data () throws File. Not. Found. Exception, Security. Exception{ File. Reader in; try { in = new File. Reader (“Data. File”); … } catch (File. Not. Found. Exception e) { //cleanup throw e; // throws it again to its caller } } catch (Security. Exception e) { //cleanup throw e; // throws it again to its caller }
finally • Exécuter un bloc quel que soit l’exception try { statement. . . } finally { statement . . . } Exécuter finally même si le bloc try lance ne exception
finally • Souvent combiné avec catch try { statement . . . } catch (Exception. Class exception. Object) { statement . . . Même si une exception est } finally { statement . . . } attrapée, finally sera toujours exécuté Utile pour s’assurer de certaine sécurité (cleanup)
Générer une exception explicitement • Un programme peut aussi générer une exception public class Bank. Account throws Illegal. Argument. Exception { public void withdraw(double amount) { if (amount > balance) { Illegal. Argument. Exception exception = new Illegal. Argument. Exception("Amount exceeds balance"); throw exception; } balance = balance - amount; } . . . } • Général: throw exception. Object; • Forcer la méthode qui appelle de traiter cette exception
Définir ses propres exceptions • Les classes d’exception 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 d’exception public class No. Data. Exception extends Exception { public No. Data. Exception () { super(); constructeurs } public No. Data. Exception (String s) { super(s); } } • Définir une hiérarchies de classes d’exception
Un autre exemple class Temperature. Exception extends Exception { } class Too. Cold. Exception extends Temperature. Exception { } class Too. Hot. Exception extends Temperature. Exception { }
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. to. String()) (which typically contains the class and detail message of cause).
Classe Throwable • 4 constructeurs • Throwable get. Cause() – Cause de cette exception (ou null) • String get. Message(): – message envoyé par l’exception • String to. String() – Générer un message décrivant l’exception • …
Penser Exception comme des classes / sous-classes Une Too. Cold. Exception est aussi une Tempreture. Exception, Throwable Attention aux catches: Catch une sous-classe avant une super-classe
Prévenir des erreurs • Certaines erreurs peuvent être détectées ou éviter • Tester la pré-conditon, post-condition ou l’invariant d’une méthode – Pré-condition: condition sous laquelle on l’appelle – 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
assert • assert boolean. Expression ; • assert boolean. Expression : expression • Si la condition non satisfaite, Assertion. Error • Exemple //Interchange list. get(i) and list. get(j) // require 0 <= i, j < list. size() … private <Element> void interchange ( List<Element> list, int i, int j) { assert 0 <= i && i < list. size(): "precondition: illegal i"; assert 0 <= j && j < list. size(): "precondition: illegal j"; …
Alternative (public) //Interchange list. get(i) and list. get(j) // require 0 <= i, j < list. size() … public <Element> void interchange ( List<Element> list, int i, int j) { if (0 <= i && i < list. size()) throw new Index. Out. Of. Bounds. Exception("illegal i“); if (0 <= j && j < list. size()) throw new Index. Out. Of. Bounds. Exception("illegal j“); …
Convention • Méthode utilitaire private: assert • Méthode public: exception – Pourquoi pas d’assert 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 d’exception approprié • Activer/Désactiver assertion: – Javac -enableassertions … – Javac -disableassertions …
Méthode private ou public • Méthodes public: – Comportement observable de l’extérieur – défini par une spécification • Méthode private – Méthode utilitaire pour faire un traitement interne – N’est pas directement visible de l’extérieur – Non définie par une spécification
Exemple • Définir une méthode qui fait retourne le plus petite valeur d’un tableau – Spécification: • Accepter un tableau de nombres entiers • Retourner la plus petite valeur stockée • Cas spécial - tableau vide: un message d’exception – Entête public int plus. Petit(int [] a)
Implantation • public int plus. Petit(int [] a) { Utiliser Exception … return pp(a, 0); } private int pp(int [] a, int ind) { Utiliser Assert … int p = pp(a, ind+1); if (p>a[ind]) return a[ind] else return p; }
- Jianyun nie
- Ift 1025
- Ift 1025
- Ift 1025
- Ift 1025
- Ift1025
- Ift 1025
- Ift1025
- Ift 1025
- Nie jedz i nie pij przy komputerze
- Ek sal nie bang wees nie
- Nie możemy nie mówić tego cośmy widzieli i słyszeli
- Nie wierz mi nie ufaj mi nuty
- Nie jedz i nie pij przy komputerze
- Mit 1025
- 1025 ce
- Chemsheets as 1017 shapes of molecules answers
- Chemsheets reactions of alcohols 1 answers
- Programmation objet php
- Programmation
- Langage scheme
- Typedef
- Théorème des écarts complémentaires
- Exemple programme robot abb
- Tableau go
- Problme
- Java aspect
- Programmation agile
- Langage ladder
- Programmation lineaire
- Programmation web avancée
- Problème de transport en programmation linéaire
- Programmation
- Planification annuelle football
- Programmation lineaire
- Programmation procédurale vs orienté objet
- Ace ift model
- Ace ift model cardiorespiratory
- Eş eksenli kablo