Chapitre 6 - Gestion des Exceptions et Assertions (Java) PDF
Document Details
A. Nejeoui
Tags
Summary
Ce document présente la gestion des exceptions et des assertions dans le langage de programmation Java. Il détaille différents types d'exceptions et comment les gérer, y compris les exceptions vérifiées (checked exceptions), les exceptions non vérifiées (unchecked exceptions) et les erreurs (errors).
Full Transcript
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...
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. La gestion des Exceptions et les 22.10.2024 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 La gestion des Exceptions et les 22.10.2024 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. La gestion des Exceptions et les 22.10.2024 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. La gestion des Exceptions et les 22.10.2024 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 La gestion des Exceptions et les 22.10.2024 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; Si vous essayez d’accéder à l’élément tab, 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 La gestion des Exceptions et les 22.10.2024 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 La gestion des Exceptions et les 22.10.2024 assertions Exemple d‘Exception non contrôlée‘ A La gestion des Exceptions et les 22.10.2024 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 2 1 Le Stack trace aide à déboguer l’application. La lecture se fait du bas vers le haut La gestion des Exceptions et les 22.10.2024 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; } La gestion des Exceptions et les 22.10.2024 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. La gestion des Exceptions et les 22.10.2024 assertions A A La gestion des Exceptions et les 22.10.2024 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; } La gestion des Exceptions et les 22.10.2024 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 La gestion des Exceptions et les 22.10.2024 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 La gestion des Exceptions et les 22.10.2024 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. La gestion des Exceptions et les 22.10.2024 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,…) La gestion des Exceptions et les 22.10.2024 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 La gestion des Exceptions et les 22.10.2024 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) La gestion des Exceptions et les 22.10.2024 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 La gestion des Exceptions et les 22.10.2024 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 La gestion des Exceptions et les 22.10.2024 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() La gestion des Exceptions et les 22.10.2024 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 class 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 La gestion des Exceptions et les 22.10.2024 assertions Exception Personnalisée La gestion des Exceptions et les 22.10.2024 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. La gestion des Exceptions et les 22.10.2024 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; } La gestion des Exceptions et les 22.10.2024 assertions Conclusion La gestion des Exceptions et les 22.10.2024 assertions