Exceptions
Exceptions
Exceptions
Les Exceptions
Philippe Genoud
dernière mise à jour : 10/01/2017
C:>java throwtest 3
certaines exécutions i = 3
peuvent faire java.lang.ArrayIndexOutOfBoundsException: 3
at throwtest.b(throwtest.java:92)
apparaître (lever)
at throwtest.a(throwtest.java:65)
des exceptions at throwtest.main(throwtest.java:58)
try {
valSurface = Integer.parseInt(surface.getText());
instructions try catch }
dans les programmes catch (NumberFormatException execpt)
{
surface.setText("ENTIER !!!");
return; // on sort sans creer d'instance
}
attraper
(catch) une exception permet d'exécuter les actions
nécessaires pour traiter cette situation.
des méthodes.
Attributs et méthodes standards (définis dans java.lang.Throwable)
contient un message
Throwable d'erreur décrivant
l'exception
String message
Constructeurs (sans et
Throwable cause
avec message d ’erreur)
Throwable()
Throwable(String s)
renvoie le message
Throwable(Throwable cause)
d'erreur décrivant
String getMessage()
l'exception
void printStackTrace()
Throwable getCause() affiche sur la sortie erreur
standard la liste des appels
Permet le « chaînage » de méthodes ayant conduit à
des exceptions l'exception (backtrace).
IOException
FileNotFound
EOFException ZipException
Exception
getNoCompte() : int
class CompteNotFoundException extends CompteException {
public CompteNotFoundException(int c, String mess) {
super(c,mess);
}
}
un bloc try est suivi par une ou plusieurs clauses catch qui permettent
d'intercepter ("attraper") les exceptions dont le type est spécifié (dans la clause
catch) et d'exécuter alors du code spécifique.
un seul bloc catch peut être exécuté : le premier suceptible "d'attraper"
l'exception.
chaque clause catch doit être déclarée avec un argument de type
Throwable ou une sous-classe de Throwable
quand une exception est levée dans le bloc try, la première clause catch
dont le type de l'argument correspond à celui de l'exception levée est
invoquée
clause catch dont l'argument est de même classe que l'exception levée,
...
Exception de type :Except1 try {
Exception ou Except2 ou Except3
// séquence de code pouvant lever
//des exceptions de type Except1,
// Except2 ou Except3
...
}
Except1 catch (Except1 e1)
quel bloc catch {
va la traiter ? // e1 est l'exception qui a été levée
// dans le bloc try
? System.out.println(e1.getMessage());
e1.printStackTrace();
Except2 // ...
}
catch (Except2 e2)
{
// ...
}
Except3 catch (Except3 e3)
{
// ...
}
...
Exception de type : try {
Exception Except1
// séquence de code pouvant lever
//des exceptions de type Except1,
// Except2 ou Except3
...
}
GrandMère
Except1 type Except2 ? catch (Except2 e2)
{
// e2 est l'exception qui a été levée
// dans le bloc try
System.out.println(e2.getMessage());
e2.printStackTrace();
Except2 // ...
}
type Except1 ? catch (Except1 e1)
{
// ...
}
Except3 catch (Except3 e3)
{
// ...
}
...
Exception de type : try {
Exception Except3
// séquence de code pouvant lever
//des exceptions de type Except1,
// Except3 ou Except2
...
}
Except1 type Except3 ? catch (Except2 e2)
{
// e2 est l'exception qui a été levée
Une Except3 // dans le bloc try
est une Except2 System.out.println(e2.getMessage());
e2.printStackTrace();
Except2 // ...
}
le bloc Except3 catch (Except1 e1)
ne peut jamais {
être atteint // ...
}
PetiteFille
Except3 d’ailleurs le catch (Except3 e3)
compilateur le signale {
// ...
}
c:>\Philippe\Java\Tests\>javac TestException.java
TestException.java:24: cath not reached
catch (Except3 e3) {
^
1 error
...
try {
Exception
// séquence de code pouvant lever
L ’ordre des blocs //des exceptions de type Except1,
catch doit respecter // Except2 ou Except3
...
l’ordre inverse de }
Except1 l'ordre d’héritage catch (Except2
catch (Except3 m)
e3)
entre les classes {{
d’exception // ...
m est l'exception qui a été levée
} // dans le bloc try
System.out.println(m.getMessage());
catch (Except2 e2)
{ m.printStackTrace();
Except2 // ...est l'exception qui a été levée
//e2
} // dans le bloc try
le bloc Except3 catch (Except1 gm)
System.out.println(e2.getMessage());
ne peut jamais { e2.printStackTrace();
être atteint ////...
...
}}
Except3 catch (Except3 pf)
catch (Except1 e1)
{
{
// ...
// ...
}
c:>\Philippe\Java\Tests\>javac TestException.java }
TestException.java:24: cath not reached
catch (PetiteFille pf) {
^
1 error
Exception
...
try { Except4
contrôle quitte le bloc try suite à une instruction return, continue, break
(d'ou parfois l'utilisation d'un bloc try avec un bloc finally sans clauses
catch).
le bloc try lève une exception attrapée par l'un des blocs catch.
le bloc try lève une exception qui n'est attrapée par aucun des blocs
catch qui le suivent.
... ...
try { try {
// ouvrir un fichier // ouvrir un fichier
// effectuer des traitements // effectuer des traitements
// susceptibles //susceptibles
// de lever une exception // de lever une exception
// fermer le fichier }
} catch (CertaineException e)
catch (CertaineException e) {
{ // traiter l'exception
// traiter l'exception }
// fermer le fichier catch (AutreTypeException e)
} {
catch (AutreTypeException e) // traiter l'exception Le bloc finally est
{ } toujours exécuté
// traiter l'exception finally {
// fermer le fichier //fermer le fichier
} }
la classe utilisée pour les exceptions dans la clause throws peut être une
superclasse de la classe de l'exception effectivement lancée
Exception
void methodeQuelconque()
throws Except1, Except4
Except2, Except3, Except4 {
Except1 Except4
// séquence de code pouvant
// lever des exceptions
// de type Except1,
Except2 // Except2, Except3 ou Except4
...
Les exceptions de type Except1 ,
Except2, Except3 et Except4 ne
} sont pas traitées dans le corps de
Except3 la méthode, elles doivent être
déclarées dans la clause throws
NON !
// séquence de code pouvant lever une
// exception de type Except5
...
}
...
La méthode redéfinie doit }
pour simplifier écriture des programmes (et permettre une extensibilité future)
les exceptions "standards" non pas besoin d'être déclarées
exceptions définies comme sous classes de Error
Error Exception
non récupérables
erreurs "systèmes"(plus de
mémoire, problèmes
chargement dynamique...)
try{
...
} catch (SomeException e) {
}
Bloc catch vide, détruit la finalité des exceptions qui est de vous obliger à traiter les
conditions exceptionnelles qu’elles sont supposer représenter.
void readFile() {
open the file;
determine its size;
allocate that much memory;
read the file into memory;
close the file;
}
readFile {
try {
open the file; Avantages du mécanisme
determine its size;
d ’exceptions
allocate that much memory;
read the file into memory; concision
close the file;
lisibilité
} catch (fileOpenFailed) {
doSomething;
} catch (sizeDeterminationFailed) {
doSomething;
} catch (memoryAllocationFailed) {
doSomething;
} catch (readFailed) {
doSomething;
} catch (fileCloseFailed) {
doSomething;
}
}
Java 7 ajoute quelques nouveautés au langage Java pour faciliter la gestion des exceptions
instruction "try-with-resources"
évite d'avoir un bloc finally pour la fermeture des ressources
Bytecode generated will be smaller (and thus superior) than compiling many catch blocks that
handle only one exception type each. A catch block that handles multiple exception types
creates no duplication in the bytecode generated by the compiler.
String query =
"select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
int supplierID = rs.getInt("SUP_ID");
float price = rs.getFloat("PRICE");
int sales = rs.getInt("SALES");
int total = rs.getInt("TOTAL");
System.out.println(coffeeName + ", " + supplierID + ", " + price +
", " + sales + ", " + total);
}
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e); A try-with-resources statement can have
} catch and finally blocks just like an
} ordinary try statement.
...
public void rethrowException(String exceptionName) throws Exception {
try {
if (exceptionName.equals("First")) {
throw new FirstException();
} else {
throw new SecondException();
}
} catch (Exception e) {
throw e;
public void rethrowException(String exceptionName)
} throws FirstException, SecondException {
} try {
// ... Even though the exception parameter of
the catch clause, e, is type Exception, the
} compiler can determine that it is an
catch (Exception e) { instance of either FirstException or
throw e; SecondException
}
}
© Philippe GENOUD UGA Janvier 2017 41
Exceptions En résumé
le code pour gérer les erreurs peut être regroupé en un seul endroit :
là où ont a besoin de traiter l'erreur
possibilité
de se concentrer sur l'algorithme plutôt que de s'inquiéter
à chaque instruction de ce qui peut mal fonctionner,
les
erreurs remontent la hiérarchie d'appels grâce à l'exécutif du
langage et non plus grâce à la bonne volonté des programmeurs.