Title: Exceptions
1Exceptions
- IFT1025 Programmation 2
- Jian-Yun Nie
2Concepts
- 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
4Ressources nécessaires
- Matériel
- Système dexploitation
- Fichiers
- Réseau
- Base de données
- Utilisateur (interaction)
5Exception
- 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
6Exemple
- 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)
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
7Message 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)
8Mé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
9Mécanisme général
- Exemples dexemption
- Diviser par 0
- Accéder un tableau avec un index invalide
Méthode qui appelle Appel
appel
Méthode appelée Normal Exception
Retour normal
Suite normale
Traiter lexception
Message dexception
10Mé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
11Traitement 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_1
Méthode_2
Méthode_3
12Exemple de transmission dexception
13Gé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
14Hiérarchie des classes dexceptions
15 16Attraper (catch) une exception
- Attraper une exception pour la traiter
try statements catch (
ExceptionClass1 object) statements
catch (ExceptionClass2 object) statements
17Exemple
- 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)
-
-
18Un 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
-
-
19Exé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
20Checked 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
21Checked vs. Unchecked exception
22Lancer 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)
23Traitement 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 -
24finally
- Exécuter un bloc quel que soit lexception
- try
-
- statement
- . . .
-
- finally
-
- statement
- . . .
-
Exécuter finally même si le bloc try lance ne
exception
25finally
- 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)
26Gé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 gt balance)
-
- IllegalArgumentException exception
- new IllegalArgumentException("Amo
unt exceeds balance") - throw exception
-
- balance balance - amount
-
- . . .
-
- Général throw exceptionObject
- Forcer la méthode qui appelle de traiter cette
exception
27Dé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
28Un autre exemple
class TemperatureException extends Exception
class TooColdException extends
TemperatureException class TooHotException
extends TemperatureException
29Classe 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
(causenull ? null cause.toString()) (which
typically contains the class and detail message
of cause).
30Classe 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
31Penser 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
32Pré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
33assert
- assert booleanExpression
- assert booleanExpression expression
- Si la condition non satisfaite, AssertionError
- Exemple
- //Interchange list.get(i) and list.get(j)
- // require 0 lt i, j lt list.size()
- private ltElementgt void interchange (
- ListltElementgt list, int i, int j)
- assert 0 lt i i lt list.size()
"precondition illegal i" - assert 0 lt j j lt list.size()
"precondition illegal j" -
34Alternative (public)
- //Interchange list.get(i) and list.get(j)
- // require 0 lt i, j lt list.size()
- public ltElementgt void interchange (
- ListltElementgt list, int i, int j)
-
- if (0 lt i i lt list.size()) throw new
IndexOutOfBoundsException("illegal i) - if (0 lt j j lt list.size()) throw new
IndexOutOfBoundsException("illegal j) -
35Convention
- 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
36Mé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
37Exemple
- 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)
38Implantation
- public int plusPetit(int a)
-
-
- return pp(a, 0)
-
- private int pp(int a, int ind)
-
-
- int p pp(a, ind1)
- if (pgtaind) return aind else return p
-
Utiliser Exception
Utiliser Assert