java_ch6

publicité
Chapitre 6
La gestion des
Exceptions et les
assertions
A. Nejeoui
Introduction
Les programmeurs dans tout les langages essayent d’écrire des applications qui
ne contiennent pas des bugs, or il es admit qu’aucun programme ne tourne
parfaitement à 100%, les programmes doivent êtres préparés à des
situations inattendues comme :
- Mauvais type de données en entrée (formulaire)
-
Fichier corrompu / introuvable
-
Problèmes de connexions
-
Défaillance matériel …etc.
En Java ces événements inattendus qui surviennent lors de l’exécution
s’appellent les Exceptions. Une application bien conçue doit être préparée
pour la gestion des exceptions.
22.04.2017
La gestion des Exceptions et les
assertions
Introduction
On utilise les erreurs/exceptions pour traiter un fonctionnement anormal d’une
partie d’un code (provoqué par une erreur ou un cas exceptionnel)
En Java, une erreur (s’elle est bien gérée) ne provoque pas l’arrêt brutal du
programme mais la création d’un objet, instance d’une classe spécifiquement
créée pour être associée à des erreurs/exceptions
22.04.2017
La gestion des Exceptions et les
assertions
Les trois catégories des Exceptions
Toutes les exceptions héritent de la classe Throwable, on distingue 3 grand
catégories des exceptions : checked exception, unchecked exception et
error.
22.04.2017
La gestion des Exceptions et les
assertions
exceptions contrôlées (Checked
Exceptions)
Soit les gérer où déclarer que votre application ne veut pas les gérer, est
cela est vérifier par le compilateur c-à-d le compilateur vérifie si vous
avez géré cette Exception où si vous avez délégué sa gestion à
l’élément appelant(c’est
pourquoi ils sont appelées des exceptions
contrôlées). Ce type d’exception représente les situations qui peuvent
survenir est que le développeur ne peut rien faire pour les éviter,
supposons par exemple que vous essayer d’ouvrir un fichier. Ce fichier
peut
être
introuvable.
Java
génère
une
exception
de
type
FileNotFindException . Ce genre d’ exceptions est Représenté par la
class Exception ce qui signifie que chaque fois qu’une exception de ce
type survienne, java instancie un objet de cette classe et le passe à
votre application, votre application peut utiliser cet objet peur obtenir
des informations concernant le type d’exception générée et d’autres
informations.
22.04.2017
La gestion des Exceptions et les
assertions
exceptions contrôlées (Checked exception )
Même si vous pouvez mettre un test sur l’existence du fichier, sa ne résout
pas le problème car, peut être une autre application qui a accès à ce
fichier peut le supprimer juste une seconde avant d’y accéder. Ce qui
fais que votre application doit être préparer pour gérer les exceptions
de type FileNotFoundException lorsque vous voulez accéder à un fichier
soit en lecture soit en écriture.



Exceptions qui héritent de la classe Exception mais qui ne sont pas des
RuntimeException
Le compilateur vérifie que les méthodes utilisent correctement ces
exceptions
Toute méthode qui peut lancer une exception contrôlée, doit le déclarer
dans sa déclaration
22.04.2017
La gestion des Exceptions et les
assertions
Exceptions non contrôlées (Unchecked
Exception)
Ce sont les Exceptions qui ne sont pas vérifiés par le compilateur. Pour savoir si
on les a géré ou pas (c’est pourquoi ils sont appelés des Exceptions non
contrôlées). Car ils peuvent être évitées par de bonnes pratiques de
programmation. Par exemple supposons que nous avons un tableaux de 5
chaînes de caractères comme suit :
String tab[] = new String[5];
Si vous essayez d’accéder à l’élément tab[5], java lève une exception de type
ArrayIndexOutOfBoundException et votre programme se termine.
Normalement par un simple test sur l’index vous pouvez éviter ce genre
d’exception, c’est pourquoi java ne complique pas la vie au programmeur en lui
forçant à gérer ce genre d’exception via le mécanisme de gestion d’exception.
Ce genre d’exception est représenté par la classe RuntimeException
22.04.2017
La gestion des Exceptions et les
assertions
Erreurs (Errors)
Un autre type d’exceptions représente les erreurs sévères qui causent l’arrêt
immédiat de l’application, le développeur ne peut rien faire ni pour éviter ni
pour gérer ce type d’erreurs, par exemple : si la mémoire du système est
insuffisante le programme se termine et génère une erreur de type
OutOfMemoryError.
Ce genre d’erreurs sont représentées par la classe Error
22.04.2017
La gestion des Exceptions et les
assertions
Exemple d‘Exception non contrôlée‘
A
22.04.2017
La gestion des Exceptions et les
assertions
La pile des appels (Stack trace)
Lorsqu’on exécute l’application avec des paramètres inadéquats la MVJ génère
une exception de type NumberFormatException, comme vous voyer cette
exception à causé l’arrêt immédiat de l’application. Car nous l’avons pas géré
dans le code par un bloc try catch finnaly. Le programme n’a aucun autre
choix que de se terminer !
La sortie par défaut que vous obtenez lorsqu’une exception non gérée est
rencontré s’appelle « Stack Trace ». C’est une chaîne de caractères
comportant Le 1 type + 2 Une description de l’exception + 3 la liste d’appels
de méthodes : quelle méthode a appellé quelle méthode ..etc jusqu’à arriver à
la méthode originale qui a généré l’exception.
3
1
2
Le Stack trace aide à déboguer l’application. La lecture se fait du bas vers le
haut
22.04.2017
La gestion des Exceptions et les
assertions
Gérer une exception
BufferedReader reader = new BufferedReader
(new InputStreamReader(System.in));
public String LireString()
{ String inputLine = "";
try
{ inputLine = reader.readLine();
}
catch(IOException e)
{ System.out.println(e);
System.exit(1);
}
return inputLine;
}
22.04.2017
La gestion des Exceptions et les
assertions
try catch finally
Le principe consiste à regrouper toutes les instruction susceptibles de générer
des exceptions dans un bloc (try) et associer un traitement spécifique pour
chaque exception attrapée dans un bloc (catch).
Ainsi si une exception est levée, le traitement y associé est éxécuter et
l’application continue normalement son flux d’exécution.
22.04.2017
La gestion des Exceptions et les
assertions
A
A
22.04.2017
La gestion des Exceptions et les
assertions
throws
Si une partie d’une méthode lève une exception que vous voulez pas gérer
avec un bloc try catch, vous déclarer que cette méthode lève ce genre
d’exception en utilisant le mot clef throws comme suit:
Exemple:
BufferedReader reader = new BufferedReader
(new InputStreamReader(System.in));
public String LireString() throws IOException {
String inputLine = "";
inputLine = reader.readLine();
return inputLine;
}
22.04.2017
La gestion des Exceptions et les
assertions
Vocabulaire
Une instruction, une méthode peut lever ou lancer une exception : une anomalie
de fonctionnement provoque la création d’une Exception
Une méthode peut attraper, saisir, traiter une exception par une clause catch
d’un bloc try catch
Une méthode peut laisser se propager une exception :
– elle ne l’attrape pas par une clause catch
– l’erreur « remonte » alors vers la méthode appelante qui peut elle-même
l’attraper ou la laisser remonter
22.04.2017
La gestion des Exceptions et les
assertions
Exception levée
en dehors d’un bloc try
La méthode retourne immédiatement ;
l’exception remonte vers la méthode appelante
2. La main est donnée à la méthode appelante
3. L’exception peut alors éventuellement être
attrapée par cette méthode appelante ou par
une des méthodes actuellement dans la pile
d’exécution
22.04.2017
La gestion des Exceptions et les
assertions
Exception levée dans un bloc try
Si une des instructions du bloc try provoque une exception, les instructions
suivantes du bloc try ne sont pas exécutées et,
– si au moins une des clauses catch correspond au type de l’exception,
1. la première clause catch appropriée est exécutée
2. l’exécution se poursuit juste après le bloc try catch
– sinon,
1. la méthode retourne immédiatement
2. l’exception remonte vers la méthode appelante.
22.04.2017
La gestion des Exceptions et les
assertions
Exécution d’un bloc try
sans erreur ou exception
Dans les cas où l’exécution des instructions de la clause try ne provoque pas
d’erreur/exception,
– le déroulement du bloc de la clause try se déroule comme s’il n’y avait pas de
bloc try-catch
– le programme se poursuit après le bloc try-catch (sauf si exécution de return,
break,…)
22.04.2017
La gestion des Exceptions et les
assertions
Cas des exceptions non traitées
Si une exception remonte jusqu’à la méthode main() sans être traitée par cette
méthode,
– l’exécution du programme est stoppée
– le message associé à l’exception est affiché, avec une description de la pile des
méthodes traversées par l’exception (Stack trace)
A noter : en fait, seul le thread qui a généré l’exception non traitée se termine;
les autres threads continuent leur exécution
22.04.2017
La gestion des Exceptions et les
assertions
Exemples de traitements
dans un bloc catch

Fixer le problème et réessayer le traitement qui a provoqué le passage au
bloc catch

Faire un traitement alternatif

Retourner (return) une valeur particulière

Sortir de l’application avec System.exit()

Faire un traitement partiel du problème et relancer (throw) la même
exception (ou une autre exception)
22.04.2017
La gestion des Exceptions et les
assertions
Souplesse dans le traitement
des exceptions
La méthode dans laquelle l’erreur a eu lieu peut :
1 – traiter l’anomalie
• pour reprendre ensuite le déroulement normal du programme,
• ou pour faire un traitement spécial, différent du traitement
normal
2 – ne rien faire, et laisser le choix du traitement à la
méthode appelante qui en sait davantage pour faire un
traitement correct du problème
3 – faire un traitement partiel de l’anomalie, et laisser les
méthodes appelantes terminer le traitement
22.04.2017
La gestion des Exceptions et les
assertions
Erreurs fréquentes liées
au traitement des exceptions
1 - Si une variable est déclarée et initialisée dans un bloc try, et utilisée
après le bloc try, le compilateur donnera un message d’erreur du type «
undefined variable » ou « Variable xx may not have been initialized »
Pour éviter cela, déclarer (et initialiser si nécessaire) la variable avant le
bloc try
2 - Ne jamais attraper une exception en mettant dans le bloc catch un
affichage de message qui ne donne que peu d’informations sur le
Problème Au moins pendant le développement, le minimum à afficher :
ce qu’affiche la méthode printStackTrace
Sinon, on perd des informations précieuses pour la résolution du problème
22.04.2017
La gestion des Exceptions et les
assertions
Exception et redifinition
Si votre méthode redéfinit une méthode de la super classe alors cette méthode
peut soit lever une sous exception de l’exception levée par la méthode définit
dans la super classe soit ne rien lever.
Exemple :
class A {
void methode() throws IOException, NumberFormatException, SQLException {
}
}
class B extends A {
void methode() throws EOFException { }
}
Sinon vous aurez une erreur de type :
Exception TypeException is not compatible with throws clause in A.methode()
22.04.2017
La gestion des Exceptions et les
assertions
Exception personnalisée
L’API java contient plusieurs classes d’exceptions que vous pouvez réutiliser.
Néanmoins, parfois vous vous retrouvez dans la nécessité de créer votre
propre classe d’exception pour gérer un type d’erreur plus spécifique.
Par exemple : vous voulez que l’utilisateur saisi une adresse e-mail.
Dans ce cas vous pouvez créer une nouvelle exception pour lever ce type
d’erreurs
pulic NotEmailException extends Exception {
public NotEmailException () {}
public NotEmailException (String msg){ super(msg);}
}
NB :
-
Toutes les exceptions crées par l’utilisateurs doivent étendre Exception et
non Error.
-
Si vouv voulez que votre exception soit contrôlée étendez directement
Exception sinon étendez RuntimeException
22.04.2017
La gestion des Exceptions et les
assertions
Exception Personnalisée
22.04.2017
La gestion des Exceptions et les
assertions
Les Assertions
Les exception sont utilisées pour améliorer la fiabilité de vos application Java.
Les assertion aussi jouent un rôle similaire.
Définition :
Une assertion est une expression qui représente une condition que le
programmeur suppose vrai à un emplacement donnée.
Syntaxe :
L'instruction assert se présente sous deux formes :
assert expression1 ;
et
assert expression1 : expression2 ;
expression1 est une expression booléenne, expression2 une expression d'un
type quelconque. Dans les deux cas, l'exécution de l'instruction assert
commence par évaluer expression1. Si cette expression est vraie,
l'exécution continue sans que rien ne se passe.
22.04.2017
La gestion des Exceptions et les
assertions
Les Assertions
En revanche, si expression1 se révèle fausse alors une erreur de type
java.lang.AssertionError est lancée. Si c'est la deuxième forme de assert qui
a été utilisée, la valeur d'expression2 figure dans le message associe a
l'erreur.
Exemple :
void Methode1(int x) {
assert MIN < x && x < MAX;
}
void Methode2(int x) {
assert MIN < x && x < MAX : "MIN < x && x < MAX, x = " + x;
}
22.04.2017
La gestion des Exceptions et les
assertions
Conclusion
22.04.2017
La gestion des Exceptions et les
assertions
Téléchargement