Vous êtes sur la page 1sur 5

Cours : Environnement JAVA

ESTI

La gestion des exceptions

1 Dfinitions
1.1 Rle dune exception
Une exception est charge de signaler un comportement exceptionnel (mais prvu) dune partie spcifique dun logiciel. Dans les langages de programmation actuels, les exceptions font partie du langage lui-mme. Cest le cas de Java qui intgre les exceptions comme une classe particulire : la classe Exception. Cette classe contient un nombre important de classes drives.

1.2 Comment agit une exception


Ds quune erreur se produit comme un manque de mmoire, un calcul impossible, un fichier inexistant, un transtypage non valide,..., un objet de la classe adquate drive de la classe Exception est instanci. On dit que le logiciel dclenche une exception. Ces mcanismes permettent de renforcer la scurit du code Java. Exemple : une exception leve l'excution non capture public class TestException { public static void main(String[] args) { int i = 3; int j = 0; System.out.println("rsultat = " + (i / j)); System.out.println("apres division"); } } Rsultat : C:>java TestException Exception in thread "main" java.lang.ArithmeticException: / by zero at TestException.main(TestException.java:5) On va voir comment intercepter (on dit aussi "attraper" - to catch) cette exception afin de faire ragir notre programme afin qu'il ne s'arrte pas brutalement.

Mr A. BenKhalifa

1/5

Cours : Environnement JAVA

ESTI

2 Les mots cls try, catch et finally


Java possde une instruction de gestion des exceptions, qui permet d'intercepter des exceptions drivant de la classe Exception. Le bloc try rassemble les appels de mthodes susceptibles de produire des erreurs ou des exceptions. L'instruction try est suivie d'instructions entre des accolades. Syntaxe : try { operation_risque1; opration_risque2; } catch (ExceptionInteressante e) { traitements } catch (ExceptionParticulire e) { traitements } catch (Exception e) { traitements } finally { traitement_pour_terminer_proprement; } Si un vnement indsirable survient dans le bloc try, la partie ventuellement non excute de ce bloc est abandonne et le premier bloc catch est trait. Si catch est dfini pour capturer l'exception issue du bloc try alors elle est traite en excutant le code associ au bloc. Si le bloc catch est vide (aucune instruction entre les accolades) alors l'exception capture est ignore. Une telle utilisation de l'instruction try/catch n'est pas une bonne pratique : il est prfrable de toujours apporter un traitement adapt lors de la capture d'une exception. Sil y a plusieurs type d'erreurs et d'exceptions intercepter, il faut dfinir autant de bloc catch que de type dvnement. Par type d'exception, il faut comprendre qui est du type de la classe de l'exception ou d'une de ses sous classes. Ainsi dans l'ordre squentiel des clauses catch, un type d'exception ne doit pas venir aprs un type d'une exception d'une super classe. Il faut faire attention l'ordre des clauses catch pour traiter en premier les exceptions les plus prcises (sous classes) avant les exceptions plus gnrales. Un message d'erreur est mis par le compilateur dans le cas contraire. " Exemple : erreur la compil car Exception est traite en premier alors que ArithmeticException est une sous classe de Exception public class TestException { public static void main(java.lang.String[] args) { int i = 3; int j = 0; try { System.out.println("rsultat = " + (i / j)); } catch (Exception e) { } catch (ArithmeticException e) { } } }

Mr A. BenKhalifa

2/5

Cours : Environnement JAVA

ESTI

Rsultat : C:\tests>javac TestException.java TestException.java:11: exception java.lang.ArithmeticException has already been caught catch (ArithmeticException e) { ^ 1 error Si l'exception gnre est une instance de la classe dclare dans la clause catch ou d'une classe drive, alors on excute le bloc associ. Si l'exception n'est pas traite par un bloc catch, elle sera transmise au bloc de niveau suprieur. L'excution totale du bloc try et d'un bloc d'une clause catch sont mutuellement exclusives : si une exception est leve, l'excution du bloc try est arrte et si lexception existe, la clause catch adquate est excute. La clause finally dfinit un bloc qui sera toujours excut, qu'une exception soit leve ou non (comme par exemple fermer un fichier qui a t ouvert auparavant). Ce bloc est facultatif. Il est aussi excut si dans le bloc try catch il y a une instruction return.

2.1 La classe Throwable


Cette classe descend directement de Object : c'est la classe de base pour les traitements des erreurs. Cette classe possde plusieurs constructeurs dont voici les principaux: Mthode Throwable() Throwable(String) La chane en paramtre permet de dfinir un message qui dcrit l'exception et qui pourra tre consulte dans un bloc catch. Rle

Les principales mthodes de la classe Throwable sont : Mthodes String getMessage( ) void printStackTrace( ) void printStackTrace(PrintStream s) Exemple : public class TestException { public static void main(String[] args) { int i = 3; int j = 0; try { System.out.println("rsultat = " + (i / j)); System.out.println("apres division"); } catch (ArithmeticException e) { System.out.print("getMessage: "); System.out.println(e.getMessage()); Rle lecture du message affiche l'exception et l'tat de la pile d'excution au moment de son appel Idem mais envoie le rsultat dans un flux

Mr A. BenKhalifa

3/5

Cours : Environnement JAVA

ESTI

System.out.print("toString: "); System.out.println(e.toString()); System.out.print("printStackTrace: "); e.printStackTrace(); } } } Rsultat : getMessage: / by zero toString: java.lang.ArithmeticException: / by zero printStackTrace: java.lang.ArithmeticException: / by zero at exception_pkg.TestException.main(TestException.java:6)

2.2 Les classes Exception, RunTimeException et Error


Ces trois classes descendent de Throwable : en fait, toutes les exceptions drivent de la classe Throwable. La classe Error reprsente une erreur grave intervenue dans la machine virtuelle Java ou dans un sous systme Java (AssertionError, ThreadDeath). L'application Java s'arrte instantanment ds l'apparition d'une exception de la classe Error. La classe Exception reprsente des erreurs moins graves. java.lang.Object | +--java.lang.Throwable | +--java.lang.Error | +--java.lang.Exception | +--java.lang.RuntimeException | +--java.lang.ArithmeticException | +--java.lang.IndexOutOfBoundsException | +--java.lang.ClassCastException

2.3 Les exceptions personnalises


Pour gnrer une exception, il suffit d'utiliser le mot cl throw, suivi d'un objet dont la classe drive de Throwable. Si l'on veut gnrer une exception dans une mthode avec throw, il faut l'indiquer dans la dclaration de la mthode, en utilisant le mot cl throws. En cas de ncessit, on peut crer ses propres exceptions. Elles descendent des classes Exception ou RunTimeException mais pas de la classe Error. Il est prfrable (par convention) d'inclure le mot Exception dans le nom de la nouvelle classe. Exemple : class SaisieErroneeException extends Exception { public SaisieErroneeException() { super();

Mr A. BenKhalifa

4/5

Cours : Environnement JAVA

ESTI

} public SaisieErroneeException(String s) { super(s); } } public class TestSaisieErroneeException { public static void controle(String chaine) throws SaisieErroneeException { if (chaine.equals("")) throw new SaisieErroneeException("Saisie erronee : chaine vide"); } public static void main(java.lang.String[] args) { String chaine1 = "bonjour"; String chaine2 = ""; try { controle(chaine1); } catch (SaisieErroneeException e) { System.out.println("Chaine1 saisie erronee"); } try { controle(chaine2); } catch (SaisieErroneeException e) { System.out.println("Chaine2 saisie erronee"); System.out.println("e.getMessage(): "+e.getMessage()); } } }

Rsultat : Chaine2 saisie erronee e.getMessage(): Saisie erronee : chaine vide Les mthodes pouvant lever des exceptions doivent inclure une clause throws nom_exception dans leur en-tte. L'objectif est double : avoir une valeur documentaire et prciser au compilateur que cette mthode pourra lever cette exception et que toute mthode qui l'appelle devra prendre en compte cette exception (traitement ou propagation). Si la mthode appelante ne traite pas l'erreur ou ne la propage pas, le compilateur gnre l'exception nom_exception must be caught or it must be declared in the throws clause of this mthode. Java n'oblige la dclaration des exceptions dans l'en-tte de la mthode que pour les exceptions dites contrles (vrifies). Les exceptions non contrles peuvent tre captures mais n'ont pas tre dclares. Les exceptions qui hritent de RunTimeException sont non controles. Toutes les autres exceptions sont contrles.

Mr A. BenKhalifa

5/5