Ecole Supérieure en Sciences et Technologies de l’informatique et du numérique
Les Exceptions
Cours 2CPI (S4) : Module POO Dr. H. EL BOUHISSI
Introduction
La gestion des erreurs est primordiale dans la robustesse d'une application.
La gestion " traditionnelle " ou à l’ancienne avec des si... ou des Case... est
compliquée et nécessite une suite d’instructions si ... alors ou gestion de cas
: mélange du traitement normal et de la gestion des erreurs.
On constate dans le cycle de développement d'un programme que la gestion
des erreurs nécessitent parfois plus d'effort de programmation que le
fonctionnement normal.
Le programme devient rapidement incompréhensible, car le cas général est
noyé au milieu de la gestion des erreurs. Le code est alors difficile à
maintenir.
DR. H. EL BOUHISSI COURS POO 2
Introduction
La POO dispose d'un gestionnaire d'exceptions permettant de séparer
le code normal du traitement des erreurs.
Les exceptions sont des objets issues de classes avec héritage.
Le programmeur peut créer et déclencher ses propres exceptions.
DR. H. EL BOUHISSI COURS POO 3
Une exception, c’est quoi ?
Une exception est une erreur ou un événement exceptionnel
qui interrompt de flux normal d'exécution d'une application.
C’est une erreur qui se produit pendant l’exécution d’un
programme.
Une exception dans un programme implique généralement son
arrêt d’exécution.
DR. H. EL BOUHISSI COURS POO 4
Une exception, c’est quoi ?
Tous les types d'exception en Java sont de type Throwable.
Throwable se trouve au sommet de la hiérarchie des
exceptions.
Immédiatement en dessous de Throwable se trouvent deux
sous-classes qui divisent les exceptions en Exception et
Errors.
DR. H. EL BOUHISSI COURS POO 5
Comment faire pour poursuivre l’exécution ?
o Repérer les blocs pouvant générer une exception
o Capturer l’exception correspondante
o Afficher un message relatif à cette exception
o Continuer l’exécution
DR. H. EL BOUHISSI COURS POO 6
Exception : exemple
public class Test {
public static void main(String[] args) { Le message Fin de calcul n’a pas été affiché
int x = 5, y = 0;
[Link](x / y); La division par zéro déclenche une
exception ArithmeticException
[Link]("Fin de calcul");
} }
Le message affiché à l’exécution
Exception in thread ”main” [Link] : / by zero
at [Link]( [Link] :4 )
DR. H. EL BOUHISSI COURS POO 7
Comment faire pour capturer une exception ?
Utiliser le bloc try { ... } catch { ... }
o Le try { ... } pour entourer une instruction susceptible de
déclencher une exception.
o Le catch { ... } pour capturer l’exception et afficher un message qui
lui correspond.
DR. H. EL BOUHISSI COURS POO 8
Exception : exemple
public class Test {
public static void main(String[] args) {
int x = 5, y = 0; Le message affiché à l’exécution
try {
[Link](x / y); Exception : Division par zéro
} Fin de calcul
catch (ArithmeticException e) { Constatation
[Link]("Exception : Division par zéro");
Explication :
}
L’exception a été capturée
[Link]("Fin de calcul"); Le message Fin de calcul a été affiché
} }
DR. H. EL BOUHISSI COURS POO 9
Et si le type d’exception n’est pas connu ?
public class Test2 {
public static void main(String[] args) {
int x = 5, y = 0;
try { Le même message sera affiché :
[Link](x / y); Exception : Division par zéro
} Fin de calcul
catch (Exception e) { Constatation
[Link]("Exception : Division par zéro "); La classe Exception peut être utilisée
}
[Link]("Fin de calcul");
} }
DR. H. EL BOUHISSI COURS POO 10
Quelques méthodes de la classe Exception
String getMessage() : retourne un message d’erreur succinct
String toString() : retourne un message d’erreur détaillé
void printStackTrace() : affiche la pile complète d’exécution menant
à l’exception.
DR. H. EL BOUHISSI COURS POO 11
Quelques méthodes de la classe Exception
public class Test3 {
public static void main(String[] args) {
int x = 5, y = 0;
try {
[Link](x / y);
}
Le même message sera affiché :
catch (Exception e) {
[Link]("Exception : " + [Link]());
Exception : / by zero
} Fin de calcul
[Link]("Fin de calcul");
} }
DR. H. EL BOUHISSI COURS POO 12
Quelques méthodes de la classe Exception
public class Test4 {
public static void main(String[] args) {
int x = 5, y = 0;
try {
Le message affiché est :
[Link](x / y);
}
catch (Exception e) { [Link](); [Link] : / by zero
} at [Link]([Link])
[Link]("Fin de calcul"); Fin de calcul
}}
DR. H. EL BOUHISSI COURS POO 13
Quelques méthodes de la classe Exception
public class Test5 {
public static void main(String[] args) {
int x = 5, y = 0;
try {
[Link](x / y); Le même message sera affiché :
}
Exception : [Link]:
catch (Exception e) {
/ by zero
[Link]("Exception : " + e. toString());
Fin de calcul
}
[Link]("Fin de calcul");
} }
DR. H. EL BOUHISSI COURS POO 14
Récapitulons !
On a utilisé (ou vu) des exceptions prédéfinies :
o Exception
o ArithmeticException
On peut aussi définir nos exceptions personnalisées !!!!!!!!!!!!!
DR. H. EL BOUHISSI COURS POO 15
Exceptions personnalisées
public class Adresse {
private String rue;
private String ville;
private String codePostal;
public Adresse(String rue, String codePostal, String ville) {
[Link] = rue;
[Link] = ville;
[Link] = codePostal;
}
// ............... Plus de codes !!!!
}
Nous supposons que le champ codePostal doit contenir exactement 5 chiffres
DR. H. EL BOUHISSI COURS POO 16
Exceptions personnalisées : démarche à suivre (1)
o Etape 1 : Créer notre propre exception (qui doit étendre la classe Exception)
o Etape 2 : Dans le constructeur de Adresse, on lance une exception si l’attribut
codePostal ne contient pas 5 chiffres
Étape 1 : Créons l’exception IncorrectCodePostalException dans un package cours17052021
public class IncorrectCodePostalException extends Exception {
// le constructeur de cette nouvelle exception
public IncorrectCodePostalException(){
[Link]("Le code postal doit contenir exactement 5 chiffres");
}} Si la classe d’erreur existe déjà, il faut lire sa
documentation avant de l’appeler !!!!!!!!
DR. H. EL BOUHISSI COURS POO 17
Exceptions personnalisées : démarche à suivre (2)
Etape 2 : Modifier le constructeur de la classe Adresse
public class Adresse {
// après les attributs
public Adresse(String rue, String ville, String codePostal) throws IncorrectCodePostalException {
if ([Link]() != 5) throw new IncorrectCodePostalException();
[Link] = rue;
[Link] = ville;
[Link] = codePostal;
}}
// il faut faire pareil dans setCodePostal()
DR. H. EL BOUHISSI COURS POO 18
Exceptions personnalisées : démarche à suivre (3)
public static void main(String[] args) {
Adresse a ;
try {
a = new Adresse ("Sidi Ahmed", "Bejaia", "06");
}
catch(IncorrectCodePostalException e) { [Link]();
} }
Le message affiché à l’écran est :
Le code postal doit contenir exactement 5 chiffres
[Link] at
[Link].<init>([Link]) at
[Link]([Link])
DR. H. EL BOUHISSI COURS POO 19
Exemple avec deux conditions (1)
On peut rajouter une deuxième :condition
codePostal doit contenir exactement 5 chiffres et la rue doit être une chaîne en
majuscule
Étape 1 : Créons l’exception IncorrectRueException dans un package cours17052021
public class IncorrectRueException extends Exception {
// le constructeur de cette nouvelle exception
public IncorrectRueException(){
[Link]("La rue doit être une chaine en majuscule");
}}
DR. H. EL BOUHISSI COURS POO 20
Exemple avec deux conditions (2)
public class Adresse2 {
// après les attributs
public Adresse2(String rue, String ville, String codePostal) throws IncorrectCodePostalException
, IncorrectRueException {
if ([Link]() != 5) throw new IncorrectCodePostalException();
if()) throw new IncorrectRueException();
[Link] = rue;
[Link] = ville;
[Link] = codePostal;
}} Chaque condition doit être traitée
individuellement, car le throw n’est pas le même
DR. H. EL BOUHISSI COURS POO 21
Exemple avec deux conditions (3)
public static void main(String[] args) {
try {
Adresse2 a = new Adresse2 (« sidi ahmed ", " Bejaia", "06");
}
catch(IncorrectCodePostalException e1) {
[Link]();
}
catch(IncorrectRueException e2) {
[Link](); Un try peut avoir plusieurs catch
}}
DR. H. EL BOUHISSI COURS POO 22
Afficher les valeurs qui ont déclenché l’exception dans le message ?
Modifier la première exception : IncorrectCodePostalException
public class IncorrectCodePostalException extends Exception {
public IncorrectCodePostalException(String cp){
[Link]("Le code postal ’" + cp + "doit contenir exactement 5 chiffres");
}}
Modifier la deuxième exception : IncorrectRueException
public class IncorrectRueException extends Exception {
public IncorrectRuexception(String rue) {
[Link]("Le nom de la rue ’" + rue + "doit être en majuscule");
}}
DR. H. EL BOUHISSI COURS POO 23
Afficher les valeurs qui ont déclenché l’exception dans le message ?
Modifier le constructeur de la classe Adresse
public class Adresse {
// apr`es les attributs
public Adresse(String rue, String ville, String codePostal) throws IncorrectCodePostalException ,
IncorrectRueException {
if ([Link]()!=5) throw new IncorrectCodePostalException(codePostal);
if()) throw new IncorrectRueException(rue);
[Link] = rue;
[Link] = ville;
[Link] = codePostal;
} }
DR. H. EL BOUHISSI COURS POO 24
Afficher les valeurs qui ont déclenché l’exception dans le message ?
public static void main(String[] args) {
try {
Adresse a = new Adresse ("Sidi Ahmed", "Bejaia", "06");
}
catch(IncorrectCodePostalException | IncorrectStreetNameException e) {
[Link]();
}}
Le message affiché est :
Le code postal " 06" doit contenir exactement 5 chiffres
DR. H. EL BOUHISSI COURS POO 25
Exécution
public static void main(String[] args) {
Adresse a ;
try {
a = new Adresse (""" Bejaia", "06");
}
catch (AdresseException e) {
[Link]();
}}
Le message affiché est :
Le code postal "1300" doit contenir exactement 5 chiffres.
Le nom de la rue ’Sidi Ahmed’ doit être en [Link] at
[Link](.<init>([Link]) at [Link]( ([Link])
DR. H. EL BOUHISSI COURS POO 26
Mécanisme try-catch-finally, mot-clé finally
A utiliser quand on veut exécuter une instruction qu’une exception soit levée ou non
public class Test6 {
public static void main(String[] args) {
int x = 5, y = 0; Le bloc finally peut s’avérer intéressant si le
try { catch contient un return qui forcera l’arrêt de
[Link](x / y); l’exécution du code.
}
catch (Exception e) {
[Link]("Division par zéro"); Malgré cela, ce bloc (finally) sera exécuté.
}
finally{
[Link]("Instruction exécutée
systématiquement");
}}}
DR. H. EL BOUHISSI COURS POO 27
Exception en pascal !!!!
Program ExceptionSamples;
{$MODE DELPHI}
Uses SysUtils;
Var x,y : integer; z:real;
BEGIN
Try
writeln('valeur de x ');
La compilation en mode FPC ne
read(x); supporte pas les exceptions, il faut
writeln('valeur de y ');
read(y);
ajouter {$MODE DELPHI} sous la
z:=x/y; déclaration du programme
writeln(z:2:2);
Except
On E:exception do WriteLn('erreur !!! Division par 0');
End;
readln; readln;
END.
DR. H. EL BOUHISSI COURS POO 28
Conclusion
•Dans tous les programmes, des erreurs peuvent survenir. Les
exceptions servent à réparer ces erreurs.
•Les exceptions sont lancées grâce au mot-clé throw, placé dans un
bloc try, et rattrapées par un bloc catch.
•La bibliothèque standard propose la classe exception comme base
pour créer ses exceptions personnalisées.
DR. H. EL BOUHISSI COURS POO 29