La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

gestion des exceptions

Présentations similaires


Présentation au sujet: "gestion des exceptions"— Transcription de la présentation:

1 gestion des exceptions

2 Par: Manaf hamza Bassir said Bouchkri abd ellah Prof: Rahmouni ossama

3 Introduction Définition des exceptions Les mots clés try, catch et finally Quelques exceptions prédéfinies en Java Arbre des exceptions Astuce d'Eclipse Des exercices

4 1_Introduction Tout programme comporte des erreurs, même si celui-ci semble fonctionner à merveille. Chaque programmeur essaye de réduire au minimum le nombre d'erreurs, mais toutes les erreurs ne peuvent pas forcément être prévues.

5 Les erreurs syntaxiques sont la plupart interceptées lors de la compilation, mais il reste souvent des erreurs "imprévisibles". Ces erreurs se produisent généralement de façon exceptionnelle, c'est-à-dire suite à une action de l'utilisateur, ou de l'environnement

6 2_Définition des exceptions
Les exceptions représentent le mécanisme de gestion des erreurs intégré au langage Java. Il se compose d'objets représentant les erreurs et d'un ensemble de trois mots clés qui permettent de détecter et de traiter ces erreurs ( try, catch et finally ) et de les lever ou les propager (throw et throws).

7 Lors de la détection d'une erreur, un objet qui hérite de la classe Exception est créé (on dit qu'une exception est levée) et propagé à travers la pile d'exécution jusqu'à ce qu'il soit traité. Ces mécanismes permettent de renforcer la sécurité du code Java.

8 Exemple : public class Test Exception {
public static void main(java.lang.String[] args) { int j = 20, i = 0; System.out.println(j/i); System.out.println("coucou toi !"); }}

9 Résultat: Vous devriez avoir un message d'erreur Java (en rouge) comme celui-ci :

10 3 Les mots clés try, catch et finally
Le bloc try est exécuté jusqu'à ce qu'il se termine avec succès ou bien qu'une exception soit levée. Dans ce dernier cas, les clauses catch sont examinées l'une après l'autre dans le but d'en trouver une qui traite cette classe d'exceptions (ou une superclasse). Les clauses catch doivent donc traiter les exceptions de la plus spécifique à la plus générale. Si une clause catch convenant à cette exception a été trouvée et le bloc exécuté, l'exécution du programme reprend son cours.

11 Bloc finally Un bloc finally permet au programmeur de définir un ensemble d'instructions qui est toujours exécuté, que l'exception soit levée ou non, capturée ou non. La seule instruction qui peut faire qu'un bloc finally ne soit pas exécuté est System.exit().

12 try / catch / finally try { ... } catch (<une-exception>)
catch (<une_autre_exception>) finally Autant de blocs catch que l'on veut. Bloc finally facultatif.

13 Ce que je vous propose maintenant, c'est de capturer l'exception de division par zéro, et d'afficher un message personnalisé. Pour ce faire, tapez le code suivant dans votre main :

14 public class Test { public static void main(String[] args) { int j = 20, i = 0; try { System.out.println(j/i); } catch (ArithmeticException e) { // TODO Auto-generated catch block System.out.println("Division par zéro !"); System.out.println("coucou toi !"); }

15 Si vous exécutez ce code, vous devez avoir :

16 4_Quelques exceptions prédéfinies en Java
Division par zéro pour les entiers : ArithmeticException Référence nulle : NullPointerException Tentative de forçage de type illégale : ClassCastException Tentative de création d'un tableau de taille négative : NegativeArraySizeException Dépassement de limite d'un tableau : ArrayIndexOutOfBoundsException

17 5_Les exceptions personnalisées
À partir de maintenant, nous allons nous servir à nouveau de notre projet Ville (celui que vous avez utilisé dans les premiers chapitres...). Nous allons perfectionner un peu la gestion de nos objets Ville et Capitale... Comment ? Eh bien je vois bien une exception qui pourrait être créée... Et je suis sûr que certains petits malins se sont déjà amusés à créer des villes ou des capitales avec un nombres d'habitants négatif....

18 Je vous propose simplement de mettre en oeuvre une exception de notre cru, ceci afin de pouvoir interdire l'instanciation d'objet Ville ou Capitale ayant un nombre négatif d'habitants. La procédure pour faire ce tour de force est un peu particulière :

19

20 Nous devons créer une classe héritée de la classe Exception : appelons-la NombreHabitantException. Par convention, les exceptions ont un nom se terminant par Exception. Nous devons renvoyer l'exception levée à notre classe NombreHabitantException. Ensuite, gérer celle-ci dans notre classe NombreHabitantException

21 Le premier mot clé throws Ce mot clé permet de dire à une instruction Java (condition, déclaration de variable...) ou à une classe entière qu'une exception potentielle sera gérée par une classe -souvent une classe personnalisée- mais ce peut être la classe Exception elle-même. Ce mot clé est suivi du nom de la classe qui va gérer l'exception. Ceci a pour but de définir le type d'exception qui risque d'être générée par l'instruction, ou la classe qui précède le mot clé throws.

22 Le deuxième mot clé throw Celui-ci permet d'instancier un objet dans la classe suivant l'instruction throws. Cette instruction est suivie du mot clé new ainsi que d'un objet cité avec throws. En fait, il lance une exception, tout simplement.

23 Pour pouvoir mettre en pratique ce système, nous devons commencer par créer une classe qui va gérer nos exceptions. Celle-ci, je vous le rappelle, doit être héritée d'Exception. Pour commencer, inutile de créer un constructeur, ce qui nous donnerait une classe Erreur, héritée de Exception, vide. Comme ceci :

24 class NombreHabitantException extends Exception{
public NombreHabitantException(){ System.out.println("Vous essayez d'instancier une classe Ville avec un nombre d'habitants négatif !"); }

25

26 Ceci signifie qu'à partir de maintenant, dû
aux changements dans le constructeur, vous devrez gérer les exceptions possibles sur cette instruction. Avec un bloc try{} catch{}. On dit aussi que votre constructeur est devenu une méthode à risque, et vous avez laissé le soin au développeur de gérer l'exception potentielle !

27 Donc, pour que l'erreur disparaisse, il nous faut entourer notre instanciation avec un bloc try{...}catch{...}. Comme ceci :

28

29 Mais si nous déclarons une Ville avec un
nombre d'habitants négatif pour tester notre exception ? Avec ce code, par exemple

30

31 Ce qui signifie que si notre instanciation a échoué dans notre bloc try{}, le programme plantera !
Comment empêcher cela, alors ? Vous allez voir, c'est très simple. Il suffit d'instancier un objet Ville par défaut dans notre bloc catch{}. Grâce à cela, si notre instanciation avec valeur échoue, on fait une instanciation par défaut qui, elle, n'est pas une méthode à risque ! Voyez plutôt :

32

33 Il vous suffit maintenant de définir cette construction de notre objet hérité d'Exception dans votre classe Ville. Comme ça :

34 public Ville(String pNom, int pNbre, String pPays)throw NombreHabitantException
{ if(pNbre < 0) throw new NombreHabitantException(pNbre); // on appelle le nouveau constructeur else { nbreInstance++; nbreInstanceBis++; nomVille = pNom; nomPays = pPays; nbreHabitant = pNbre; this.setCategorie(); } }

35 Et si vous exécutez le même code que précédemment, vous obtiendrez ceci :

36

37 6_Arbre des exceptions Throwable Exception Error OutOfMemoryError
String (message d'erreur) Exception Error OutOfMemoryError Les erreurs sont graves et il est recommandé de ne pas les corriger. RunTimeException NullPointerException ClassCastException ... VosExceptions... exceptions prédéfinies

38 7_Astuce d'Eclipse chose.
Il y a plusieurs manières de procéder, mais toutes font la même chose. L'astuce ici réside dans le fait de générer les blocs try{} catch{} automatiquement. Bien sûr, il faut que les clauses de déclenchement soient définies au préalable !

39 Si vous reprenez le code de votre méthode main, si vous effacez le contenu et ajoutez une instanciation de l'objet Ville sans les clauses try{} catch{}, vous avez l'erreur persistante dont je vous parlais au début du chapitre. Si vous cliquez sur la croix rouge, située à gauche de votre zone de saisie, vous obtenez ceci :

40

41 Choisissez l'option Surround with try/catch et vous avez votre code, tout beau tout propre ! La deuxième méthode consiste à sélectionner votre (ou vos) ligne(s) de code à risque et de faire : Source / Surround with / try/catch block ou d'utiliser le raccourci clavier Shift + Alt + Z : Voici l'image en utilisant le menu :

42

43 Voici l'image en utilisant le raccourci clavier :

44 Exercice 1- Division par zéro
1- Écrire un programme qui effectue une division par zéro et ne contient aucun traitement d'exception. Que se passe-t-il? Pourquoi? Quel est le type de l'exception générée. 2- Cette fois, ré-écrire le programme pour capturer l'exception. 3- Le modifier pour afficher un message d'erreur explicite. 4- Cette fois, le programme corrige lui même et remplace la division par zéro par une division par 1. Remarquons ainsi que lever une exception ne signifie forcement l'affichage d'un message d'erreur suivi de l'arrêt du programme mais qu'il peut y avoir poursuite normale de l'exécution

45 Exercice 2- Saisie d'un mot de passe
Dans les failles de sécurité réseau, on trouve très souvent les problèmes de dépassement. Par exemple, sur certaines anciennes versions de telnet, un login ou un mot de passe de plus d'un mega-octet faisait "planter" le programme et on obtenait alors un accès root au système. Ce programme va gérer ce type de problème en séparant les exceptions pour une meilleure gestion. 1- Écrire un programme stand-alone qui demande en boucle un nom d'utilisateur (login) et un mot de passe (pwd) jusqu'à recevoir un login/pwd correct.

46


Télécharger ppt "gestion des exceptions"

Présentations similaires


Annonces Google