1 Le mécanisme des exceptions Qu'est-ce qu'une exception? Comment définir et signaler des exceptions? Comment récupérer des exceptions?

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Portée des variables VBA & Excel
Spécialisation/généralisation Héritage Polymorphisme.
Spécialisation/généralisation Héritage Polymorphisme
Le mécanisme des exceptions
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
gestion des exceptions
Cours MIAGE « Architectures Orientées Services » Henry Boccon-Gibod 1 Architectures Orientées Services Composants de Service Exemple pratique de développement.
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Programmer en JAVA par Tama
Algorithme et structure de données
Packages et résolution de noms
Tarak Chaari, Stéphane Frénot, Frédérique Laforest, Frédéric Le-Mouël JAV1 JAV – TD 5 Lhéritage en Java.
Chap. 1 Structures séquentielles : listes linéaires
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage Java.
Traitement des erreurs en Java
Chapitre III Héritage (début)
Principes de programmation (suite)
44 Contrôle du déroulement du programme. 4-2 Objectifs A la fin de ce cours, vous serez capables de : Utiliser les constructions de prise de décision.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Langage Oriente Objet Cours 4.
Les exceptions. Quest ce quune exception ? Une erreur dans le programme Due à un bug ou un cas « anormal » Gestion complète en java : JVM Dans dautre.
1 Les pointeurs et quelques rappels sur certains éléments du langage C.
Chapitre VII Généricité. POO-L3 H. Fauconnier2 Chapitre VII 1. Principes généraux 2. Types génériques imbriqués 3. Méthodes génériques 4. Types paramètres.
IFT1025, Programmation 2 Jian-Yun Nie
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
Java : Héritage & Exceptions
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Classes abstraites et Interfaces
F Copyright © Oracle Corporation, Tous droits réservés. Créer des programmes avec Procedure Builder.
Complément Le diagramme des classes
Langage Oriente Objet Cours 2.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Présentation Structures de Données et TDA
Gestion et levée dexception. Une exception est un message envoyé par une méthode à une autre méthode. La méthode qui la reçoit a le choix de soccuper.
IFT 6800 Atelier en Technologies d’information
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Cours 8 (18 novembre 2011) exceptions. héritagePOO-L3 H. Fauconnier2 Tableau et héritage Y[] yA=new Y[3]; X[] xA=yA; //ok xA[0]=new Y(); xA[1]=new X();
COURS DE PROGRAMMATION ORIENTEE OBJET :
COURS DE PROGRAMMATION ORIENTEE OBJET :
Structures de données IFT-10541
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
1111 Gestion des exceptions Objectifs À la fin de ce cours, vous serez capables de : • Expliquer les concepts de base de la gestion des exceptions.
Structures des données
ECOLE DES HAUTES ETUDES COMMERCIALES MARKETING FONDAMENTAL
Ch. PAUL - Piles et Files à l'aide de listes chainées
LES PILES ET FILES.
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
GESTION ET TRAITEMENT DES ERREURS
Java : Exceptions H Batatia. 5/03/2004Java12: H.Batatia2 Exemple 1 public class Bonjour { public static void main(String[] args) { System.out.println("Bonjour.
11/04/ L'héritage Cours 7 Cours 7.
Cours 7 Classes locales Clonage Divers: tableaux.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 6 – Exceptions.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
Tutorat en bio-informatique
12/04/ Les exceptions Cours 11 Cours 11.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Schéma de conception Factory Method Exemple Sylvain Giroux.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
6ième Classe (Mercredi, 17 novembre) CSI2572
Héritage Conception par Objet et programmation Java
Traitement des erreurs en Java: les exceptions
1 COURS DE PROGRAMMATION ORIENTEE OBJET : Exceptions.
Classes abstraites, interface Classe interne Classes enveloppes
Exception Handling "Unfortunately, it's almost accepted practice to ignore error conditions, as if we're in a state of denial about errors." Bruce Eckel.
Transcription de la présentation:

1 Le mécanisme des exceptions Qu'est-ce qu'une exception? Comment définir et signaler des exceptions? Comment récupérer des exceptions?

2 Qu'est-ce qu'une exception? due à une faute de saisie un problème matériel une faute de programmation Causes externes au programme Bugs } Un objet qui représente une erreur à l'exécution o.f() avec o = null NullPointerException T[i] avec i = T.length ArrayIndexOutOfBoundsException

3 Hiérarchie des exceptions en Java Object Throwable Classe mère des exceptions Attributs : message d'erreur (une String) état de la pile des appels Méthodes : public Throwable() public Throwable(String message) public String getMessage() public void printStackTrace()

4 Object Throwable Error Ne pas capturer! VirtualMachineError ClassNotFoundError Exception OutOfMemoryError UnknownError Error = problème de la machine virtuelle : Erreurs internes manque de ressources

5 Exception RunTimeException Erreurs de programmation Arithmetic Exception (ex: div par 0) NumberFormatException (ex: String -> int) NegativeArraySizeException ArrayIndexOutOfBoundsException IOException causes externes et exceptions utilisateurs

6 Méthodes génératrices d'exceptions Toute méthode doit déclarer les exceptions qu'elle est susceptible de lancer/transmettre … sauf si ce sont des RuntimeException ou Error Pas obligatoire public static int parseInt(String s) throws NumberFormatException {……………………} classe java.lang.Integer public final String readLine() throws IOException {……………………} classe java.io.BufferedReader

7 Philosophie générale Exceptions hors contrôle les Error car leur traitement ne nous est pas accessible les Runtime car on naurait pas dû les laisser survenir Exceptions sous contrôle Toutes les autres !

8 public final String readLine() throws IOException { if (……) throw new IOException(); } Exemple crée un objet d'une certaine classe d'exception (ici IOException) signale (lève) cette exception : throw Méthodes génératrices d'exceptions Signalement

9 Exceptions dans une classe utilisateur : Point public class Point { private int x, y; //coordonnées public Point(int x, int y) {……………} public String toString() { return x + " " + y; } public void deplace (int dx, int dy) // ajoute dx et dy à x et y {……………} } // fin classe On ajoute la contrainte : un Point doit avoir des coordonnées positives ou nulles. Comment assurer le respect de cette contrainte?

10 public Point(int x, int y) { // si x < 0 ou y < 0, que faire? this.x = x; this.y = y; } public void deplace (int dx, int dy) { // si (x + dx) < 0 ou (y + dy) < 0, // que faire? x += dx; y += dy; }

11 public class PointCoordException extends Exception { public PointCoordException() { super() ; } public PointCoordException(String s) {super(s); } } Une classe d'exception pour Point On pourrait aussi créer une hiérarchie de classes d'exception pour Point

12 public Point(int x, int y) { // si x < 0 ou y < 0, // générer une PointCoordException this.x = x; this.y = y; }

13 public Point(int x, int y) { if ((x < 0) || (y < 0)) throw new PointCoordException ("création pt invalide "+ x + ' ' + y); this.x = x; this.y = y; } throws PointCoordException

14 public void deplace (int dx, int dy) { // si (x + dx) < 0 ou (y + dy) < 0, // générer une PointCoordException x += dx; y += dy; }

15 public void deplace (int dx, int dy) { if ((x + dx < 0) || (y + dy < 0)) throw new PointCoordException ("déplacement invalide "+dx+' '+dy); x += dx; y += dy; } throws PointCoordException

16 Capture versus transmission d'exception public static int lireEntier() { BufferedReader clavier = new BufferedReader (new InputStreamReader(System.in)); String s = clavier.readLine(); int ilu = Integer.parseInt(s); return ilu; } Erreur de compilation : lireEntier() doit capturer l'exception susceptible d'être transmise par readLine() ou déclarer qu'elle peut transmettre une exception (la laisser passer)

17 public static int lireEntier() * ajout à l'entête {…………} * throws IOException * * La clause throws doit "englober" tous les types d'exception à déclaration obligatoire susceptibles d'être transmis de la manière la plus spécifique possible Solution 1 : la laisser passer throws IOException, NumberFormatException throws Exception pas très informant !

18 public static int lireEntier() { BufferedReader clavier = ……; try { String s = clavier.readLine(); int ilu = Integer.parseInt(s); } catch (IOException e) {………………} return ilu; //* } Solution 2 : la capturer (et la traiter) 1) surveiller l'exécution d'un bloc d'instructions : try 2) capturer des exceptions survenues dans ce bloc : catch * Erreur de compilation : ilu inconnu

19 public static int lireEntier() { BufferedReader clavier = ……; int ilu = 0; try { String s = clavier.readLine(); ilu = Integer.parseInt(s); } catch (IOException e) {} // on capture e mais traitement = rien return ilu; } Que se passe-t-il si : une exception est générée par readLine ? (IOException) par parseInt ? (NumberFormatException)

20 public static int lireEntier() { BufferedReader clavier = ……; int ilu = 0; try { String s = clavier.readLine(); // 1 ilu = Integer.parseInt(s); } // 2 catch (IOException e) {} // on capture e mais traitement = rien return ilu; // 3 } l'exécution continue en 3 : ilu retourné (avec valeur 0) Si une exception est générée par readLine : 2 n'est pas exécuté ; clause catch capture l'exception ;

21 public static int lireEntier() { BufferedReader clavier = ……; int ilu = 0; try { String s = clavier.readLine(); // 1 ilu = Integer.parseInt(s); } // 2 catch (IOException e) {} // on capture e mais traitement = rien return ilu; // 3 } 3 n'est pas exécuté Si une exception est générée par parseInt (NumberFormatException) : aucune clause catch ne capture l'exception ; elle est donc transmise à l'appelant ;

22 Si une exception est générée dans un bloc try, l'exécution s'interrompt les clauses catch sont examinées dans l'ordre, jusqu'à en trouver une qui "englobe" la classe de l'exception s'il en existe une : le bloc du catch est exécuté, et l'exécution reprend juste après les clauses catch sinon : l'exception n'est pas capturée ; elle est donc transmise à l'appelant, et le reste de la méthode n'est pas exécuté try + une (ou plusieurs) clause(s) catch [On peut ajouter une clause finally par laquelle on passe toujours]

23 méthode f(…)throws E4 { try { pouvant générer des E1, E2, E3 et E4 } catch(E1) { } catch(E2) { } finally { } } Exception E1 E2 E3 E4 (1) (2) (3) (4) (5) Que se passe-t-il dans les différents cas envisageables ?

24 public static int lireEntier() { BufferedReader clavier = ……; int ilu = 0; try { String s = clavier.readLine(); ilu = Integer.parseInt(s); } catch (Exception e) {} // on capture e mais traitement = RIEN return ilu; } Retour à lireEntier() Qu'en penser...? Essayons de trouver une bonne façon de gérer les erreurs

25 Problème... L'erreur n'est pas vraiment réparée: si 0 est retourné, l'appelant ne peut pas savoir que ça ne correspond pas forcément à une valeur saisie Si on ne sait pas comment traiter une exception, il vaut mieux ne pas l'intercepter Trouvons un traitement plus approprié …

26 public static int lireEntier()throws IOException { BufferedReader clavier = ……; int ilu = 0; boolean succes = false ; while (! succes) { try { String s = clavier.readLine(); ilu = Integer.parseInt(s); succes = true; } catch (NumberFormatException e) { System.out.println("Erreur : " + e.getMessage()); System.out.println("Veuillez recommencer … "); } } // end while return ilu; }

27 public static int lireEntier() throws IOException, MauvaisFormatEntierException { BufferedReader clavier = ……; int ilu = 0; try { String s = clavier.readLine(); ilu = Integer.parseInt(s); } catch ( NumberFormatException e) { throw new MauvaisFormatEntierException()} return ilu;} lireEntier() Changer de niveau dabstraction Lerreur de bas-niveau retournée est interceptée et transformée en erreur du niveau de lireEntier()

28 A ne pas faire Remplacer un test par la génération d'une exception tableau d'entiers Tab de taille t Problème : calculer l'indice i du premier 0 de Tab s'il existe (sinon i est affecté de –1) int i = 0; try { while (Tab[i]!= 0) i++;} catch(ArrayIndexOutOfBoundsException e) { i = -1; } NON !

29 A ne pas faire Cacher les exceptions pour éviter des erreurs de compilation public void f() { try { ………… // ici le corps normal de f } catch (Exception e) {} } NON !

30 A ne pas faire Chercher à traiter des exceptions à tout prix public void f (String nomFichier) { On essaye d'ouvrir le fichier dont le nom est passé en paramètre Si une FileNotFoundException surgit, que faire? } A faire : transmettre l'exception à l'appelant, jusqu'à arriver à la méthode qui a décidé du nom de fichier

31 Quelle(s) attitude(s) cette méthode peut-elle adopter face aux PointCoordException susceptibles d'être générées? public Rectangle CreerRect(int x1, int y1, int x2, int y2) { Point p1 = new Point(x1, y1); Point p2 = new Point(x2,y2); Rectangle r = new Rectangle(p1,p2); return r; } Exercice : soit une méthode qui utilise la classe Point :

32 Retour sur la conception Comment déterminer les exceptions : invariants de classe lâge dune personne est compris entre 0 et 140 une personne mariée est majeure préconditions dépiler() seulement si pile non vide postcondition après empiler(a), lélément est dans la pile abstraction/encapsulation des exceptions des parties ou des éléments de limplémentation Point mal formé --> Rectangle mal formé tableau interne de pile plein --> impossible dempiler

33 Retour sur la conception Comment organiser les exceptions : une racine pour les exceptions associées à une classe RectangleException, SquareException sous la racine, exceptions pour les invariants de classes les pré- et post-conditions les exceptions des sous-classes sorganisent sous les exceptions de la classe

34 RectangleException SquareException Rectangle Square NegativeSideException NegativeWidthException NegativeHeightException NotEqualSidesException

35 Redéfinition de méthodes Dans la redéfinition: Ajouter une déclaration nest pas possible Retirer une exception est possible Spécialiser une exception est possible Dessiner(RectangleException, IOException) Peut être redéfinie en Dessiner (NegativeWidthException)