Vous êtes sur la page 1sur 167

Fiabilit

Universit de Nice - Sophia Antipolis


Version 2.2 12/2/12
Richard Grin

Plan de cette partie


Exceptions
Assertions
Journalisation (logging)

R. Grin

Fiabilit

Fiabilit dun logiciel

La fiabilit dun logiciel concerne


la robustesse : la capacit du logiciel fonctionner,
mme en prsence dvnements exceptionnels tels
que la saisie dinformations errones par
lutilisateur
la correction : le fait que le logiciel donne les
rsultats corrects lorsquil fonctionne normalement

R. Grin

Fiabilit

Fiabilit en Java

2 mcanismes principaux de Java facilitent une


bonne fiabilit :
les exceptions pour la robustesse
les assertions pour la correction

On peut aussi utiliser


lAPI de journalisation (logging) ;
java.util.logging

exceptions,
assertions et
journalisation
tudis dans cette
partie du cours

les dbuggeurs
les outils de tests dunits (comme JUnit) ou de
tests fonctionnels
R. Grin

Fiabilit

Les exceptions

R. Grin

Fiabilit

Erreurs/exceptions
On utilise les erreurs/exceptions pour traiter un
fonctionnement anormal dune partie dun code
(provoqu par une erreur ou un cas exceptionnel)
En Java, une erreur ne provoque pas larrt
brutal du programme mais la cration dun objet,
instance dune classe spcifiquement cre pour
tre associe des erreurs/exceptions

R. Grin

Fiabilit

Localisation du traitement des


erreurs/exceptions
Les traitements des erreurs et conditions
anormales seffectuent dans une zone du
programme spciale (bloc catch )
Plutt que de compliquer le code du traitement
normal, on traite les conditions anormales
part
Le traitement normal apparat ainsi plus
simple et plus lisible

R. Grin

Fiabilit

Traitement avec exception


try {
// lire la valeur de n au clavier;
int n = lireEntierAuClavier(); Traitement
normal
etagere.add(livre, n);
}
catch(NumberFormatException e) {
System.err.println("Mauvais numro emplacement");
}
catch {EtagerePleineException e) {
System.err.println("Etagere pleine");
}

R. Grin

Fiabilit

Bloc try-catch
try {
Remarque : ne compile
pas si aucune instruction
. . .
du bloc try ne lance
. . .
de TrucException
}
catch(TrucException e) {
// Traitement de lexception e
. . .
}
catch(MachinException e) {
. . .
}
R. Grin

Fiabilit

Multi-catch

Depuis le JDK 7 il est possible dattraper


plusieurs types dexceptions dans un bloc catch :
try {

}
catch(Type1Exception |
Type2Exception |
Type3Exception e) {
...
}

Aucune des exceptions


du multi-catch ne doit
tre un sur-type dune
autre exception du
multi-catch

Remarque : en cas de multi-catch, e est


implicitement final

R. Grin

Fiabilit

10

Vocabulaire (1)

Une instruction, une mthode peut lever ou


lancer une exception : une anomalie de
fonctionnement provoque la cration dune
exception

R. Grin

Fiabilit

11

Vocabulaire (2)

Une mthode peut attraper, saisir, traiter une


exception par une clause catch dun bloc trycatch

Une mthode peut laisser se propager une


exception :
elle ne lattrape pas
lerreur remonte alors vers la mthode
appelante qui peut elle-mme lattraper ou la
laisser remonter si on reprsente la pile dexcution
avec son sommet vers le bas

R. Grin

Fiabilit

12

Mcanisme de traitement
des exceptions

R. Grin

Fiabilit

13

Exception leve
en dehors dun bloc try
1. La mthode retourne immdiatement ;
lexception remonte vers la mthode appelante
2. La main est donne la mthode appelante
3. Lexception peut alors ventuellement tre
attrape et traite par cette mthode appelante
ou par une des mthodes actuellement dans la
pile dexcution
R. Grin

Fiabilit

14

Exception leve dans un bloc try

Si une des instructions du bloc try provoque une


exception, les instructions suivantes du bloc try
ne sont pas excutes et,
si au moins une des clauses catch correspond au
type de lexception,
1. la premire clause catch approprie est excute
2. lexcution se poursuit juste aprs le bloc trycatch
sinon,
1. la mthode retourne immdiatement
2. lexception remonte vers la mthode appelante

R. Grin

Fiabilit

15

Exception traite par un bloc catch


Cas particuliers

R. Grin

Si lexcution dun bloc catch rencontre un


return, un break ou un continue,
lexcution se poursuit lendroit du
programme correspondant (et pas juste aprs
le bloc try-catch)

Fiabilit

16

Excution dun bloc try


sans erreur ou exception

Dans les cas o lexcution des instructions


de la clause try ne provoque pas
derreur/exception,
le droulement du bloc de la clause try
se droule comme sil ny avait pas de
bloc try-catch
le programme se poursuit aprs le bloc
try-catch (sauf si excution de return,
break,)

R. Grin

Fiabilit

17

Cas des exceptions non traites


Si une exception remonte jusqu la mthode
main sans tre traite par cette mthode,
lexcution du programme est stoppe
le message associ lexception est
affich, avec une description de la pile des
mthodes traverses par lexception
A noter : en fait, seul le thread qui a gnr
lexception non traite meurt ; les autres
threads continuent leur excution

R. Grin

Fiabilit

18

Exemples de traitements
dans un bloc catch
Fixer le problme et ressayer le traitement qui
a provoqu le passage au bloc catch
Faire un traitement alternatif
Retourner (return) une valeur particulire
Sortir de lapplication avec System.exit
Faire un traitement partiel du problme et
relancer (throw) la mme exception (ou une
autre exception)

R. Grin

Fiabilit

19

Souplesse dans le traitement


des exceptions

La mthode dans laquelle lerreur a eu lieu peut


traiter lanomalie
pour reprendre ensuite le droulement normal du
programme,
ou pour faire un traitement spcial, diffrent du
traitement normal
ne rien faire, et laisser remonter lexception
faire un traitement partiel de lanomalie, et laisser les
mthodes appelantes terminer le traitement

R. Grin

Fiabilit

20

Pourquoi laisser remonter


une exception ?
Plus une mthode est loigne de la mthode
main dans la pile dexcution, moins elle a
une vision globale de lapplication
Une mthode peut donc laisser remonter une
exception si elle ne sait pas comment la
traiter, en esprant quune mthode
appelante en saura assez pour la traiter

R. Grin

Fiabilit

21

Erreur frquente lie


au traitement des exceptions

Si une variable est


dclare et initialise dans un bloc try,
et utilise aprs le bloc try,

le compilateur donnera un message derreur du


type undefined variable ou Variable xx
may not have been initialized
Pour viter cela, dclarer (et initialiser si
ncessaire) la variable avant le bloc try
R. Grin

Fiabilit

22

Dclaration incorrecte
try {
int n;
n = ParseInt(args[0]);
etagere.add(livres[n]);
}
catch(NumberFormatException e) {
// Erreur
System.err.println("Mauvais emplacement " + n);
return;
}
catch {EtagerePleineException e) {
System.err.println("Etagere pleine");
return;
}
n++; // provoque une erreur la compilation
R. Grin

Fiabilit

23

Dclaration correcte
int n=0;// dclaration/initialisation hors du bloc try
try {
n = ParseInt(args[0]);
etagere.add(livres[n]);
}
catch(NumberFormatException e) {
System.err.println("Mauvais emplacement " + n);
return;
}
catch {EtagerePleineException e) {
System.err.println("Etagere pleine");
return;
}
n++; // pas derreur la compilation
R. Grin

Fiabilit

24

Autre erreur viter


Ne jamais attraper une exception en mettant
dans le bloc catch un affichage de message
qui ne donne que peu dinformations sur le
problme
Au moins pendant le dveloppement, le
minimum afficher : ce quaffiche la mthode
printStackTrace (voir classe Throwable)
Sinon, on perd des informations prcieuses
pour la rsolution du problme

R. Grin

Fiabilit

25

Clause finally

R. Grin

Fiabilit

26

Clause finally

La clause finally contient un traitement qui


sera excut dans tous les cas, que la clause
try ait lev ou non une exception, que cette
exception ait t saisie ou non
try {
. . .
}
catch () {
. . .
}
finally {
. . .
}

R. Grin

On peut, par exemple,


fermer un fichier
Fiabilit

27

Traitement gnral des exceptions


try {
. . .
}
catch (ClasseException1 e) {
. . .
}
catch (ClasseException2 e) {
. . .
}
Il est possible davoir un ensemble
. . .
try - finally sans clause catch
finally {
. . .
}
R. Grin

Fiabilit

28

finally est toujours excut


Le bloc finally est toujours excut (sauf
aprs System.exit()), mme si le bloc try ou
le bloc catch se termine par une instruction
return ou lance une exception
Si le bloc try produit une exception

si un bloc catch attrape cette exception, il est


excut, et ensuite le bloc finally est excut
sinon, le bloc finally est excut, et ensuite
l'exception se propage la mthode appelante
R. Grin

Fiabilit

29

Prdominance du bloc finally


sur les blocs try et catch
Si le bloc finally lance une exception, la
mthode lance cette exception, quelque soit ce
qui sest pass dans les blocs try et catch
Si le bloc finally se termine par une
instruction return, la mthode retourne
normalement ; aucune exception nest leve

Il faut viter ces 2 situations car elles nuisent la


lisibilit ; les dernires versions des compilateurs
affichent un avertissement

R. Grin

Fiabilit

30

Prdominance du bloc finally


sur les blocs try et catch

Si le bloc finally se termine par une


instruction ordinaire (ne lance pas dexception
et ne se termine pas par un return), le bloc
finally est excut, et la mthode se termine
(pour lexception leve et la valeur retourne)
comme si le bloc finally navait pas t
excut

R. Grin

Fiabilit

31

try avec ressources

R. Grin

Fiabilit

32

try avec ressources


Nouvelle syntaxe apporte par le JDK 7
Facilite la fermeture automatique des
ressources qui en ont besoin : flots, fichiers,
connexion sur une base de donnes,
Appel aussi ARM (Automatic Resource
Management)
La clause try peut comporter une premire
section qui numre les ressources qui seront
fermes automatiquement la fin du bloc try

R. Grin

Fiabilit

33

Exemple sans try avec ressources


InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream("f1");
out = new FileOutputStream("f2");
byte[] buf = new byte[8192]; int n;
while ((n = in.read(buf)) >= 0)
out.write(buf, 0, n);
} finally {
if (in != null) in.close();
if (out != null) out.close();
}
R. Grin

Fiabilit

34

Exemple avec try avec ressources


try (
InputStream in = new FileInputStream("f1");
OutputStream out = new FileOutputStream("f2")
) {
byte[] buf = new byte[8192];
;
int n;
optionnel
derrire la
while ((n = in.read(buf)) >= 0)
dernire
out.write(buf, 0, n);
ressource
}
R. Grin

Fiabilit

35

Avantages
Les ressources sont fermes la sortie du bloc
try, quoi quil arrive (comme avant)
Le code est bien plus lisible (surtout si
plusieurs ressources doivent tre fermes)
Aucune exception nest perdue (voir
transparents suivants)

R. Grin

Fiabilit

36

Porte des variables lies aux


ressources fermes automatiquement
La porte des variables lies aux ressources
commence la dclaration de la ressource et va
jusqu la fin du bloc try
Lorsque les blocs catch ou finally sont
excuts, ces variables ne sont pas utilisables,
ce qui peut parfois poser un problme (peut
alors se rsoudre en embotant plusieurs blocs
try) ; les ressources sont aussi dj fermes

R. Grin

Fiabilit

37

Exception lance lors de louverture


de ressource gre automatiquement
Le comportement est le mme que si
louverture avait lieu au dbut du bloc try
(aprs laccolade ouvrante)
Lexception peut tre attrape dans le bloc
catch du try (pas entre les parenthses qui
suivent le try)
Si elle nest pas attrape et quelle est contrle
par le compilateur, la mthode englobante doit
comporter un throws li lexception

R. Grin

Fiabilit

38

Exception perdue
Avec un try normal (sans gestion
automatique des ressources) une exception
lance dans le bloc try peut tre perdue si la
fermeture des ressources lance une autre
exception car le bloc finally lemporte
Ce comportement peut nuire la mise au point

R. Grin

Fiabilit

39

Rcuprer une exception perdue


Avec try avec ressources, cest lexception
lance par le try qui est lance
On peut rcuprer lautre exception perdue
(celle lance par la fermeture des ressources)
avec la mthode getSuppressed() de

Throwable

R. Grin

Fiabilit

40

Mthode qui utilise


un try avec ressources

Exemple

try {
copierFichiers(in, out);
} catch(CopieException e) {
e.printStackTrace();
}

Si le try avec ressources de copierFichiers peut


lancer une CopieException et la fermeture des
ressources peut lancer une CloseException, on attrape
une CopieException mais printStackTrace
affichera une ligne
Suppressed: CloseException
R. Grin

Fiabilit

41

Interface
java.lang.AutoCloseable
Les classes des ressources qui peuvent tre
gres par un try avec ressources doivent
implmenter cette interface
Contient la mthode void close()
Les connexions JDBC limplmentent, mais
pas les classes de JPA
Les classes utilises pour faire des entressorties implmentent java.io.Closeable qui
hrite de AutoCloseable

R. Grin

Fiabilit

42

Les diffrents types


derreurs/ exceptions

R. Grin

Fiabilit

43

Les classes derreurs/exceptions


Les classes lies aux erreurs/exceptions sont des
classes places dans larborescence dhritage
de la classe java.lang.Throwable (classe
fille de Object)
Le JDK fournit un certain nombre de telles
classes
Le programmeur peut en ajouter de nouvelles

R. Grin

Fiabilit

44

Arbre dhritage des exceptions


Throwable

Error

Exception

RuntimeException Exceptions contrles


Exceptions prdfinies
dans les paquetages JDK

R. Grin

Fiabilit

Exceptions dfinies
par le programmeur

45

Arbre dhritage des exceptions


Erreurs graves

Throwable

Error

Exception

RuntimeException Exceptions contrles


Exceptions prdfinies
dans les paquetages JDK

R. Grin

Fiabilit

Exceptions dfinies
par le programmeur

46

Arbre dhritage des exceptions


Exceptions non contrles
par le compilateur

Throwable

Error

Exception

RuntimeException Exceptions contrles


Exceptions prdfinies
dans les paquetages JDK

R. Grin

Fiabilit

Exceptions dfinies
par le programmeur

47

Arbre dhritage des exceptions


Throwable

Error

Exception

RuntimeException

Exceptions contrles

Exceptions prdfinies
dans les paquetages JDK

R. Grin

Exceptions contrles
par le compilateur

Fiabilit

Exceptions dfinies
par le programmeur

48

Quelques sous-classes de
RuntimeException

NullPointerException
IndexOutOfBoundsException et sa sous-classe
ArrayIndexOutOfBoundsException
ArithmeticException
IllegalArgumentException et sa sous-classe
NumberFormatException
ClassCastException
NoSuchElementException

R. Grin

Fiabilit

49

Quelques exceptions du JDK,


contrles par le compilateur
Exception

Runtime
Exception

ClassNotFound
Exception

IOException

FileNotFoundException

EOFException

R. Grin

Interrupted
Exception

Fiabilit

50

Exceptions contrles (1)


Exceptions qui hritent de la classe Exception
mais qui ne sont pas des RuntimeException
Le compilateur vrifie que les mthodes utilisent
correctement ces exceptions
Toute mthode qui peut lancer une exception
contrle, doit le dclarer dans sa dclaration

int m() throws TrucException {


. . .
}
R. Grin

Fiabilit

51

Exceptions contrles (2)


Soit une mthode m2() avec une en-tte qui
contient throws TrucException
Si une mthode m1() fait un appel m2()
soit m1() entoure lappel de m2() avec un
bloc try catch(TrucException)
soit m1() dclare quelle peut lancer une
TrucException (ou un type plus large)

R. Grin

Fiabilit

52

Exceptions contrles (3)


Len-tte dune mthode m() peut trs bien
contenir throws TrucException sans
que le corps de la mthode ne lance cette
exception
Ce procd est rarement utilis mais peut
avoir son intrt si on sait que la mthode
risque dtre redfinie par du code qui
renverra cette exception

R. Grin

Fiabilit

53

Pourquoi des exceptions contrles ?


Pour obliger le dveloppeur tenir compte des
cas dexception qui ont pu arriver durant
lexcution dune mthode
En langage C, les cas particuliers dans le
traitement dune fonction sont souvent indiqus
par le fait que la fonction renvoie une valeur
particulire (par exemple -1 est renvoye en
cas de problme, alors que les cas normaux
renvoient une valeur positive)

R. Grin

Fiabilit

54

Pourquoi des exceptions contrles ?


Le dveloppeur peut oublier ce cas et
rcuprer la valeur -1 pour la traiter comme
toutes les autres valeurs
De plus les exceptions permettent beaucoup
plus de souplesse dans le traitement des cas
dexception que le simple fait de renvoyer une
valeur particulire, comme par exemple la
possibilit de laisser remonter une exception

R. Grin

Fiabilit

55

Pourquoi des exceptions


non contrles ?
Les exceptions non contrles peuvent survenir
dans toute portion de code (par exemple
NullPointerException ou
IllegalArgumentException)
Si ces exceptions taient contrles, toutes les
mthodes auraient une clause throws ou
seraient truffes de bloc try-catch

R. Grin

Fiabilit

56

Exceptions et en-ttes de mthodes


Une mthode peut dclarer pouvoir renvoyer
plusieurs types dexception
Exemple :

public final Object readObject() throws


IOException, ClassNotFoundException

Les exceptions peuvent tre des exceptions


contrles (le plus souvent) mais aussi des
exceptions non contrles

R. Grin

Fiabilit

57

Regrouper des traitements derreurs


Larbre dhritage de Throwable permet de
regrouper les traitements des erreurs lies
toutes les sous-classes dune classe dexception
Par exemple,

catch(IOException e) { . . .}

permet de regrouper le traitement de toutes les


erreurs dues aux entres/sorties (EOFException,
FileNotFoundException, )
R. Grin

Fiabilit

58

Exception ou traitement normal ?

Il faut rserver les exceptions aux traitements


des erreurs ou des cas exceptionnels et viter de
les utiliser pour traiter un cas normal

R. Grin

Fiabilit

59

Exemple
Si un fichier est lu du dbut la fin, ne pas
utiliser EOFException pour reprer la fin du
fichier ; utiliser plutt la valeur spciale
renvoye par la mthode de lecture quand elle
rencontre la fin du fichier
Mais si on rencontre la fin du fichier avant
davoir lu les 10 valeurs dont on a besoin,
utiliser EOFException

R. Grin

Fiabilit

60

Exceptions et performances
Si aucune exception nest leve, limpact sur
les performances dun bloc try-catch est
ngligeable
La leve dune exception peut au contraire
avoir un impact non ngligeable sur les
performances
Une autre bonne raison de ne pas utiliser les
exceptions pour les cas normaux

R. Grin

Fiabilit

61

Constructeurs des exceptions

Par convention, toutes les exceptions doivent


avoir au moins 2 constructeurs :
un sans paramtre
un autre dont le paramtre est une chane de
caractres utilise pour dcrire le problme

R. Grin

Fiabilit

62

Chanage de Throwable
Le JDK 1.4 a ajout des constructeurs la classe
Throwable qui prennent un Throwable en
paramtre, ce qui permet le chanage
dexceptions (tudi plus loin)
Les classes dexception des API auront aussi le
plus souvent des constructeurs qui permettent le
chanage dexception de plus bas niveau
Par exemple pour lier une FactureException
la IOException qui en est la cause premire

R. Grin

Fiabilit

63

Mthodes de la classe Throwable

getMessage() retourne le message


derreur associ linstance de Throwable
(getLocalizedMessage() : idem en langue
locale)
printStackTrace() affiche sur la sortie
standard des erreurs (System.err), le

message derreur et la pile des appels de


mthodes qui ont conduit au problme
getStackTrace() rcupre les lments
de la pile des appels
R. Grin

Fiabilit

64

Variante de printStackTrace
La variante sans paramtre affiche la pile sur le
fichier des erreurs standard (lcran par dfaut)
Une variante prend un paramtre de type
PrintWriter pour choisir un autre flot de
sortie
Si on choisit un flot StringWriter dcor par
un PrintWriter, on peut ainsi enregistrer la
pile dans une chane de caractres pour, par
exemple, la passer un logger (notion tudie

dans la suite de ce cours)


R. Grin

Fiabilit

65

Exemple
catch (TrucException e ) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
pw.flush();
logger.info(sw.toString());
logger.warning("Problme : ... ");
}

R. Grin

Fiabilit

66

Lancer une exception avec throw

R. Grin

Fiabilit

67

Lancer une exception


Le programmeur peut lancer lui-mme des
exceptions depuis les mthodes quil crit
Il peut lancer des exceptions des classes
dexceptions fournies par le JDK
Ou lancer des exceptions appartenant de
nouvelles classes dexceptions, quil a luimme crites, et qui sont mieux adaptes aux
classes quil a crites

R. Grin

Fiabilit

68

Lancer une exception du JDK


public class Employe {
. . .
public void setSalaire(double salaire) {
if (salaire < 0)
throw new IllegalArgumentException(
"Salaire ngatif !");
this.salaire = salaire;
Cration
}

dune instance

R. Grin

Exceptions

69

Crer une nouvelle classe


dexception

R. Grin

Fiabilit

70

Crer une classe dexception


Si on utilise les classes dexception existantes,
linformation transporte par les exceptions
peut tre insuffisante pour dterminer et donner
une solution satisfaisante au problme
Le programmeur peut avoir crer ses propres
classes dexception pour sadapter mieux aux
classes de lapplication
Par convention, les noms de classes
dexception se terminent par Exception

R. Grin

Fiabilit

71

Exemple

Lexception
contient une
public class EtagerePleineException
rfrence
extends Exception {
ltagre pleine
private Etagere etagere;
public EtagerePleineException(Etagere etagere)
{
super("Etagre pleine");
this.etagere = etagere;
}
. . .
public Etagere getEtagere() {
return etagere;
}
Noubliez pas dajouter au moins
}
le constructeur sans paramtre et
celui qui prend
R. Grin
Fiabilit un message en paramtre
72

Utiliser la nouvelle classe dexception


public class Etagere {
. . .
public void ajouteLivre(Livre livre)
throws EtagerePleineException {
if (nbLivres >= livres.length)
throw new EtagerePleineException(this);
livres[nbLivres++] = livre;
}
. . .
}
R. Grin

Fiabilit

73

Autre faon dcrire ajouteLivre


public void ajouteLivre(Livre livre)
throws EtagerePleineException {
try {
Attention ne pas
livres[nbLivres] = livre;
incrmenter dans
nbLivres++;
cette ligne
}
catch(ArrayIndexOutOfBoundsException e) {
throw new EtagerePleineException(this);
}
}

Quelle est la meilleure solution ?


R. Grin

Fiabilit

74

Attraper la nouvelle exception


// tagre de 10 livres
Etagere etagere = new Etagere(10);
...
try {
etagere.ajouteLivre(new Livre("Java", "Eckel"));
}
catch(EtagerePleineException e) {
System.err.println("Ltagre ne peut contenir que "
+ e.getEtagere().getContenance());
e.printStackTrace();
}
R. Grin

Fiabilit

75

Complments sur les exceptions

R. Grin

Fiabilit

76

Exceptions et redfinition
Soit une mthode m() de B qui redfinit une
mthode dune classe mre A
m() ne peut pas dclarer renvoyer (throws)
plus dexceptions contrles que m() de A ;
elle peut renvoyer
les mmes exceptions
des sous-classes de ces exceptions
moins dexceptions
aucune exception

R. Grin

Exceptions

77

Exceptions et redfinition

En effet, m() de B doit pouvoir tre utilise


par une mthode qui utilise m() de A, et qui
nattrape que des exceptions lances par m()
de A

R. Grin

Fiabilit

78

Exceptions et constructeurs

Aucune instance nest cre si une exception


est leve par un constructeur

R. Grin

Fiabilit

79

Chanage des exceptions


Depuis le JDK 1.4 on peut chaner les
exceptions
On peut ainsi lancer une exception de plus haut
niveau smantique, sans perdre les
informations donnes par lexception de plus
bas niveau que lon a attrap
Le chanage se fait au moment o on construit
lexception de plus haut niveau : on passe au
constructeur lexception de bas niveau, qui est
la cause premire de lexception

R. Grin

Fiabilit

80

Exemple de chanage
try {
. . .
}
catch(IOException e) {
throw new FactureException(.., e);
}

R. Grin

Fiabilit

81

Exception avec chanage


La classe dexception de haut niveau doit
prvoir un constructeur avec un paramtre de
type Throwable pour le chanage de
lexception de plus bas niveau
Par exemple :

HautNiveauException(String message,
Throwable cause) {
super(message, cause);
Appel du constructeur
}
de la classe
Exception

R. Grin

Fiabilit

82

Chanage explicite de 2 exceptions

La classe Throwable contient la mthode


Throwable initCause(Throwable cause)

qui permet de chaner une cause (ne peut tre


appel quune seule fois pour un throwable
donn)
Cette mthode renvoie le throwable qui le
message est envoy

R. Grin

Fiabilit

83

Rcuprer la chane des exceptions

Le code qui attrape lexception ex de plus haut


niveau peut obtenir lexception de dpart par
lappel ex.getCause() (mthode de la classe
Throwable)

R. Grin

Fiabilit

84

Choix des exceptions lancer

R. Grin

Fiabilit

85

Le dveloppeur peut hsiter dans le choix du


type dexception que pourra lancer une des
mthodes quil a crites
Voici quelques critres de choix

R. Grin

Fiabilit

86

Error
Les Error sont rserves aux erreurs qui
surviennent dans le fonctionnement de la JVM
Par exemple, un problme de mmoire
OutOfMemoryError, une mthode qui nest
pas trouve NoSuchMethodError
Elles ne devraient jamais arriver
Elles ne devraient jamais tre lances par le
code crit par le dveloppeur

R. Grin

Fiabilit

87

RuntimeException
Cest le bon choix si le problme ne pourra tre
rsolu (en attrapant lexception) par une des
mthodes appelantes (dans la pile dexcution)
Inutile dalourdir le code des mthodes
appelantes en les forant attraper une
exception (ou ajouter une clause throws) si
on sait quelles ne pourront rsoudre le
problme

R. Grin

Fiabilit

88

RuntimeException

Elles peuvent tre dues un bug du code (par


exemple
ArrayIndexOutOfBoundsException)

R. Grin

Fiabilit

89

RuntimeException
Convient aussi si le problme est d une
mauvaise utilisation de la mthode
Exemple : passage dun paramtre invalide

IllegalArgumentException

Comme une Error, une exception non


contrle ne devrait jamais arriver ; elle est due
une erreur indpendante du code do elle a
t lance (un rseau dfaillant, passage dun
mauvais paramtre,)

R. Grin

Fiabilit

90

Traitement des exceptions


non contrles
Une bonne solution est de laisser remonter
lexception jusqu une classe proche du dbut
de laction qui a provoqu le problme
Cette classe attrape lexception, lenregistre
comme vnement inattendu (systme de
logging ; voir la suite de ce cours), remet
ventuellement les choses en place et stoppe
proprement laction qui a provoqu le
problme ; elle prvient lutilisateur sil le faut

R. Grin

Fiabilit

91

Exceptions contrles
Pour les cas peu frquents mais, au contraire
des exceptions non contrles, pas inattendus
Elles correspondent des scnarios envisags
par le dveloppeur et participent donc la
logique de lapplication
Elles sont rserves aux problmes qui
pourront tre rsolus (au moins partiellement)
par une des mthodes de la pile dexcution
Par exemple, si une tagre est pleine, le code
qui a voulu ajouter un livre pourra choisir une
autre tagre

R. Grin

Fiabilit

92

Le JDK et les exceptions contrles


Le JDK contient des API qui abusent des
exceptions contrles
Elles utilisent ces exceptions alors que la
mthode appelante ne pourra pas rsoudre le
problme
Par exemple, JDBC (lie au langage SQL) et
les entres-sorties
En ce cas, une solution est dattraper
lexception contrle et de renvoyer une
exception non contrle

R. Grin

Fiabilit

93

viter le laisser aller

Mais attention ne pas utiliser des exceptions


non contrles uniquement pour ne pas tre
gn dans lcriture des mthodes qui utilisent
la mthode qui peut lancer lexception (pour
viter davoir crire des throws ou des try
catch finally)

R. Grin

Fiabilit

94

Exceptions du JDK
ou nouveau type dexception ?
Si une exception du JDK convient, il vaut mieux
lutiliser car ces exceptions sont bien connues
des dveloppeurs
Sinon, ne pas hsiter crer un nouveau type
dexception
Ainsi, sil nexiste pas dexception du JDK au
bon niveau dabstraction pour lapplication, il
vaut mieux crer un nouveau type dexception

R. Grin

Fiabilit

95

Quand lever une exception


Si une exception doit tre leve il vaut mieux
quelle le soit le plus prs possible de lendroit
du code lorigine du problme
Par exemple, si une exception est due un
paramtre qui na pas une valeur correcte, il
faut lancer lexception au dbut de la mthode
sil est possible de dtecter le problme

R. Grin

Fiabilit

96

Quand lever une exception

Un exemple caricatural de mauvaise


programmation : accepter une valeur null
comme paramtre du modificateur setXxx
dune variable dinstance xxx et lever une
exception seulement lors de lutilisation de
cette variable dinstance : xxx.m();

Il sera en effet plus difficile de trouver la ligne


de code qui a provoqu lerreur

R. Grin

Fiabilit

97

Messages derreur

R. Grin

Fiabilit

98

Savoir lire un message derreur

Les messages derreurs affichs par la JVM


correspondent la sortie de la mthode
printStackTrace

Lire attentivement ces messages fait gagner


beaucoup de temps pour corriger du code

R. Grin

Fiabilit

99

Savoir lire un message derreur


Le message commence par le message
derreur associ lerreur qui a provoqu
laffichage
On a ensuite la pile des mthodes traverses
depuis la mthode main pour arriver
lerreur
Les mthodes les plus rcemment excute
sont en premier, la mthode main en dernier

R. Grin

Fiabilit

100

Savoir lire un message derreur

A chaque tape, on a le numro de la ligne


en cause

A la place du numro de ligne, on peut avoir le


message unknown Source si la JVM
Hotspot a pr-compil le code
Dans ce dernier cas, on peut faire afficher les
numros de ligne, en compilant la classe qui
provoque lerreur avec loption g (si on a son
fichier source)

R. Grin

Fiabilit

101

Les assertions

R. Grin

Fiabilit

102

Points critiques
Pour vrifier la correction dun programme il
est utile de vrifier certaines assertions des
endroits bien choisis du programme
La programmation par contrat (design by
contract) a formalis lutilisation des assertions
Le langage Eiffel en implmente une partie

R. Grin

Fiabilit

103

Localisation des points critiques

Les points critiques vrifier sont


le dbut (pr-condition qui vrifie les
paramtres) et la fin (post-condition) des
mthodes (contrat client utilisateur de la
mthode)
les invariants de classe (dont hritent les
classes filles) pour vrifier une proprit de
ltat dune instance
les invariants de boucle
aprs un traitement complexe

R. Grin

Fiabilit

104

Les assertions en Java

Java nimplmente quune trs petite partie de


la programmation par contrat

R. Grin

Fiabilit

105

assert
le JDK 1.4 a introduit un nouveau mot-cl
assert qui permet dinsrer des assertions qui
vont lancer une erreur AssertionError
(classe du paquetage java.lang, fille de
Error) lorsquelles ne seront pas vrifies
Ces vrifications peuvent tre actives en
priode de test, et dsactives en production

R. Grin

Fiabilit

106

Syntaxe

assert assertion;
assertion est une expression boolenne
assert assertion : expression;
expression peut tre nimporte quelle
expression ; sa valeur sera affiche si assert

provoque une erreur

R. Grin

Fiabilit

107

Exemples (1)

R. Grin

if (x == 0) {
. . .
}
else {
// x doit tre gal 0 ou 1
assert x == 1 : x ;
. . .
}

Fiabilit

108

Exemples (2)

R. Grin

switch(x) {
case 1: . . .
case 0: . . .
case 1: . . .
case default: assert false : x;
}

Fiabilit

109

Compilation
Par dfaut assert nest pas reconnu par javac
Ainsi les anciennes classes qui avaient des
mthodes assert peuvent tre compiles sans
problme
javac source 1.4 . . .
reconnat assert comme mot-cl

R. Grin

Fiabilit

110

Excution

Pour activer les assertions (sauf dans les


classes systme) :
java ea

Pour activer seulement pour un paquetage (et


ses sous-paquetages) ou une classe :
3 points
java -ea<nom-paquetage>...
java ea<nom-classe>

taper tels
quels !

Pour dsactiver seulement pour un paquetage


ou une classe ; par exemple :
java ea -da<nom-paquetage>...

R. Grin

Fiabilit

111

Cot des assertions


Pour les performances, les assertions
dsactives ne cotent que le test dun seul
drapeau qui indique quelles sont dsactives
Cependant, les assertions prennent de la place
dans le code compil
Un idiome Java permet de librer cette place

R. Grin

Fiabilit

112

Astuce pour librer


la place des assertions
static final boolean assertionsActives =
<true ou false>;
if (assertionActives) {
assert expression;
}

Si assertionsActives est false, le compilateur


va sapercevoir que assert expression ne
peut tre atteint et va enlever cette instruction
du code compil

R. Grin

Fiabilit

113

Limitations de assert
Pas assez puissant pour vrifier simplement
une assertion du type i t[i] > 0
Ne pas utiliser pour les pr-conditions car le
contrat ne sera pas vrifi quand les assertions
seront dsactives en production ; utiliser
plutt les exceptions pour les pr-conditions
Les assertions de type invariant de classe ne se
transmettent pas aux classes filles

R. Grin

Fiabilit

114

Quand utiliser assert ?


On peut souvent hsiter entre utiliser une
assertion ou utiliser une exception
Le principe gnral pour choisir est le suivant :
les assertions sont faites pour vrifier la
logique interne dun programme mais pas pour
vrifier une condition qui ne dpend pas
compltement du code que vous crivez
En effet, les assertions sont normalement
dsactives en production

R. Grin

Fiabilit

115

Quand utiliser assert ? Exemples


Ne pas utiliser une assertion pour vrifier une
condition qui dpend de lextrieur de
lapplication (saisie dune valeur par
lutilisateur par exemple)
Ne pas utiliser les assertions pour vrifier une
pr-condition dune mthode public (mais on
peut le faire pour une mthode private)
Utiliser les assertions pour les post-conditions,
les invariants de boucle, de classe, aprs les
traitements complexes

R. Grin

Fiabilit

116

Journalisation (logging)

R. Grin

Fiabilit

117

Souvent les dveloppeurs ajoutent des


System.out.println dans leur code pour
suivre ce qui se passe dans une application
Ils doivent ensuite les enlever quand ils ont
trouv les erreurs quils cherchaient
Et ensuite en remettre si un problme survient
chaque fois il faut recompiler les classes
Il existe une bien meilleure solution, le logging

R. Grin

Fiabilit

118

Le logging
Le logging permet de suivre/enregistrer certains
vnements qui surviennent dans une
application
Le plus souvent on veut ainsi reprer les
vnements anormaux, signe dun problme
Au contraire de assert, la journalisation
ninterrompt pas le droulement de lapplication
et lutilisateur de lapplication na souvent
mme pas connaissance de son fonctionnement

R. Grin

Fiabilit

119

Paquetage pour le logging


Le paquetage java.util.logging fournit le
code pour faire du logging
Il a t introduit par le JDK 1.4

R. Grin

Fiabilit

120

Support de logging
Les vnements reprs par le systme de
logging peuvent tre affichs lcran mais le
plus souvent ils sont enregistrs dans un
fichier, journal de bord de lapplication
Ce journal de bord pourra tre consult par
linformaticien en charge de lapplication pour
reprer les problmes ventuels

R. Grin

Fiabilit

121

Niveaux des messages

La journalisation permet de fournir des


messages de diffrents niveaux ; par exemple
une simple information sur ce qui sest pass
un avertissement
un avis de problme important

Il est possible de choisir dans un fichier de


configuration ou lexcution le niveau de
gravit minimum des messages qui seront
fournis
Les messages de niveau infrieur ne seront pas
produits

R. Grin

Fiabilit

122

Les acteurs

Logger : initie lenregistrement des messages

de logging qui ont le niveau requis


LogRecord : support pour transmettre les
messages des loggers vers les handlers
Handler : exporte les messages vers une
destination (par exemple un fichier)
Filter : slection fine des messages logger
Formatter : met en forme les messages
R. Grin

Fiabilit

123

Messages de logging

Les messages sont crs par des loggers ,


avec la mthode log ; par exemple
logger.log(Level.WARNING,
"problme Machin", ex);

Ce message ne sera produit que si on a fix


un niveau infrieur ou gal WARNING le
niveau minimum des messages que lon
souhaite produire
Si le niveau a t fix SEVERE (niveau
suprieur) le message ne sera pas produit

R. Grin

Fiabilit

124

Niveaux des messages

SEVERE (le plus fort) : problme srieux

WARNING : problme potentiel

INFO : une information

CONFIG : pour informer dune configuration

FINE : tracer lexcution

FINER : avec plus de dtails

FINEST (le moins fort) : encore plus de dtails

ALL : tous les messages seront produits

OFF : pas de logging

R. Grin

Fiabilit

125

Mthodes log

Cette mthode est surcharge par de


nombreuses mthodes ; en particulier
log(Level niveau, String message)
log(Level niveau, String message,
Object paramtre)
log(Level niveau, String message,
Object[] paramtres)
log(LogRecord enregistrement)

Les paramtres sont des objets quelconques qui


compltent le message

R. Grin

Fiabilit

126

Paramtres des message


Les messages peuvent contenir des { n } o
n est un nombre qui dsigne un paramtre (le
1er paramtre a le numro 0)
Exemple :

logger.log(Level.WARNING, "Nombre
ngatif: {0}", n);
donnera Nombre ngatif : -5 si n a la valeur

-5
R. Grin

Fiabilit

127

Mthodes logp
La mthode log indique lemplacement du code
qui a gnr le message (la classe et la mthode)
Des optimisations du compilateur peuvent
rendre imprcises ces informations
Les mthodes logp permettent de passer en
paramtre le nom de la classe et de la mthode

R. Grin

Fiabilit

128

Mthodes logrb

Les mthodes logrb permettent de passer en


paramtre le nom dun resource bundle pour
sortir les messages dans plusieurs langues (voir
le cours sur linternationalisation des
applications)

R. Grin

Fiabilit

129

Mthodes pour les niveaux

Au lieu de donner le niveau dun message, on


peut utiliser des mthodes spcifiques de la
classe Logger qui ont le mme nom que le
niveau auquel elle correspondent (severe,
warning, info,) :
logger.warning("problme Machin");

R. Grin

Fiabilit

130

Mthode throwing
utiliser pour signaler quune mthode se
termine en lanant une exception (throw) ; le
niveau du message est FINER
Signature :

throwing(String classe-source,
String mthode-source,
Throwable exception)

R. Grin

Fiabilit

131

Entre et sortie de mthode

Des mthodes utilitaires peuvent tre utilises


lors des entres et sorties de mthodes :
entering(String classe-source,
String mthode-source)
exiting(String classe-source,
String mthode-source)

Variantes de entering avec un 3me paramtre


pour indiquer le ou les paramtres de la mthode,
et de exiting pour indiquer la valeur de retour
Le niveau du message est FINER

R. Grin

Fiabilit

132

Fixer le niveau minimum

2 faons de fixer le niveau en dessous duquel


les messages ne seront pas produits :
par programmation, par exemple
logger.setLevel(Level.SEVERE);

Avec un fichier de proprits (tudi la fin


de cette section)
On peut aussi filtrer les messages par un autre
critre que le niveau (filtres tudis plus loin)
Attention, le niveau du handler intervient aussi
R. Grin

Fiabilit

133

Obtenir un logger
On obtient un logger par la mthode static
getLogger de la classe Logger
On lui passe un nom (ici fr.truc) ; on obtient
un nouveau logger, ou un logger existant si un
logger de ce nom a dj t cr :

Logger.getLogger("fr.truc");

On peut aussi passer un ResourceBundle en


2me paramtre de getLogger si on veut
permettre des messages localiss

R. Grin

Fiabilit

134

Nom dun logger


On peut donner nimporte quel nom mais il est
recommand de donner au logger le nom
complet de la classe o le logger a t cr (ou
quil suit)
La configuration du suivi des classes en sera
facilite (tudie la fin de cette section)
On peut aussi lui donner le nom du paquetage
de la classe pour une configuration un peu
moins fine

R. Grin

Fiabilit

135

Hirarchie des loggers


Chaque logger a un logger parent
La hirarchie correspond au nom du logger
Par exemple, le parent du logger de nom
fr.truc.machin sappelle fr.truc
Le logger racine a pour nom la chane
vide ; il sobtient par

Logger.getLogger("");

R. Grin

Fiabilit

136

Exemple
package fr.truc;
import java.util.logging.*;
public class Classe {
private static Logger logger =
Logger.getLogger("fr.truc.Classe");
public static void main(String[] args){
logger.fine("Dbut");
try { Machin.do(); }
catch (Error ex){
logger.log(Level.WARNING,
"problme Machin", ex);
}
logger.fine("Fini !"); } }
R. Grin

Fiabilit

137

Handler
Les messages de logging sont passs un
handler pour leur publication
Chaque handler a sa faon de fournir les
messages lextrieur de lapplication :
sur lcran (ConsoleHandler)
dans un fichier (FileHandler)
dans un flot (StreamHandler)
dans un socket (SocketHandler)
en mmoire (MemoryHandler)

R. Grin

Fiabilit

138

Handler
On peut associer plusieurs handlers un logger
Soit par programmation :

logger.addHandler(
new FileHandler("fichier.log"));

Soit dans un fichier de configuration (par


<nom logger>.handlers =) ; le sparateur est la
virgule :
fr.unice.p1.handlers =
java.util.logging.FileHandler,
java.util.logging.ConsoleHandler

R. Grin

Fiabilit

139

MemoryHandler
Ne fait quenregistrer les messages en mmoire
On peut indiquer ce type de handler de passer
les messages (push) emmagasins un autre
handler, par exemple un FileHandler, dsign
au moment de la cration du handler
Les messages emmagasins ne seront transmis
que si une condition survient
La condition peut tre larrive dun message
dun niveau minimum (setPushLevel)

R. Grin

Fiabilit

140

FileHandler
Sans doute le plus utilis ; enregistre les
messages dans des fichiers
Il est possible dindiquer un, ou plusieurs
fichiers qui seront utiliss circulairement
Par dfaut le niveau est Level.ALL ; il suffit
donc de fixer le niveau du logger pour que les
messages de logging soient enregistrs
Voir la javadoc pour plus dinformations

R. Grin

Fiabilit

141

FileHandler nom des fichiers


Les noms et emplacement des fichiers peuvent
tre donns sous la forme de patterns contenant
par exemple %h pour dsigner le rpertoire
HOME de lutilisateur
Par dfaut, le pattern est %h/java%u.log ;
%u reprsente un nombre entier (normalement
0) qui peut tre augment si un fichier log de
mme nom est dj utilis ; / dsigne le
sparateur dans les noms de fichier, quel que
soit le systme

R. Grin

Fiabilit

142

Configuration dun FileHandler


La configuration dun handler comporte de
nombreuses proprits
En voici quelques unes
limit : taille maximum de chaque fichier (0
pour ne pas donner de taille maximum)
count : nombre de fichiers utiliss tour de rle
pattern : nom et emplacement des fichiers
append : les messages des nouvelles sessions
sont mis la suite des anciens si la valeur est true
(false par dfaut)

R. Grin

Fiabilit

143

Explications
Si 2 fichiers (count = 2), les noms par dfaut
des fichiers sont java0.log.0 et java0.log.1
Un fichier par session (mme si le fichier nest
pas plein, compte tenu de la valeur de limit) et
les derniers messages viennent dans le fichier
java0.log.0 (et pas linverse !)
Si append a la valeur true, les messages des
nouvelles sessions sajoutent dans le fichier en
cours, jusqu ce quil soit plein (avec rptition
de len-tte XML pour chaque session)

R. Grin

Fiabilit

144

Niveau des Handlers


Attention, certains handlers naffichent pas par
dfaut tous les niveaux de gravit de messages
Par exemple, ConsoleHandler naffiche que
les messages de niveau INFO et suprieur
Si on veut faire sortir un niveau infrieur, il
faut, non seulement fixer le niveau du logger,
mais aussi fixer le niveau du handler (voir
exemple du transparent suivant)

R. Grin

Fiabilit

145

Exemple
// Pour enlever la console par dfaut
LogManager.getLogManager().reset();
ConsoleHandler ch = new ConsoleHandler();
ch.setLevel(Level.FINE);
Logger logger = Logger.getLogger("truc");
logger.addHandler(ch);
logger.setLevel(Level.FINE);

R. Grin

Fiabilit

146

Classe Formatter

Chaque handler a un formateur qui met en


forme le message produit ; on lindique dans le
fichier de configuration (proprit
<nom handler>.formatter) ou par
handler.setFormatter(f1);

Un formateur est une instance dune classe qui


hrite de la classe Formatter ; cette classe
doit redfinir la mthode
String format(LogRecord record)

R. Grin

Fiabilit

147

Format de sortie
Par dfaut les sorties sur lcran sont en format
texte simple (formatteur
java.util.logging.SimpleFormatter) et
les messages dans un fichier sont en XML
(java.util.logging.XMLFormatter)
Il est possible de construire son propre format
de sortie pour SimpleFormatter (proprit
java.util.logging.SimpleFormatter.format)

R. Grin

Fiabilit

148

Format de SimpleFormatter
Avec SimpleFormatter, par dfaut, les
messages ont 2 lignes ; la 1re ligne donne la
date et la mthode qui a gnr le message et la
2me ligne est le message proprement dit
Exemple :
fvr. 12, 2012 2:01:45 PM fr..MaClasse1 m
Infos: Excution mthode m
Voir javadoc de SimpleFormatter pour plus
de dtails pour changer ce format

R. Grin

Fiabilit

149

Format de XMLFormatter
<log>
<record>
<date>2012-02-12T14:28:53</date>
<millis>1329053333320</millis>
<sequence>0</sequence>
<logger>fr..MaClasse1</logger>
<level>WARNING</level>
<class>fr.unice.grin.logging.MaClasse1</class>
<method>m</method>
<thread>1</thread>
<message>Nombre ngatif: -5</message>
</record>
...
R. Grin

Fiabilit

150

Cheminement du LogRecord (1)


Lorsquun message est produit, il est enregistr
dans une instance de LogRecord
Cet enregistrement est alors pass tous les
handlers du logger

R. Grin

Fiabilit

151

Cheminement du LogRecord (2)


Il remonte ensuite au logger parent qui le passe
ses handlers, et ainsi de suite
Lappel de setUseParentHandlers(false)
de la classe Logger permet de stopper cette
remonte si on le souhaite
Rappel : le parent du logger de nom
fr.unice.machin a pour nom fr.unice ; il
est donc simple dindiquer les classes qui
seront suivies en fixant le niveau dun logger
(voir transparent suivant)

R. Grin

Fiabilit

152

Filtres
Si on veut filtrer les messages avec dautres
attributs que le niveau, on peut filtrer les
LogRecord avec un filtre attach un handler
Le filtre doit tre une instance dune classe qui
implmente linterface Filter
On associe un filtre un logger, ou un
handler avec les 2 mthodes de mme signature
des classes Logger et Handler

setFilter(Filter filtre)
throws SecurityException
R. Grin

Fiabilit

153

Filtrage

La mthode (de Filter) boolean


isLoggable(LogRecord enregistrement)

indique si le handler traitera lenregistrement


ou lignorera
Le filtrage peut tre effectu sur tout attribut du
LogRecord

Par exemple, sur les paramtres du message


(passs en paramtre de log)
On utilise pour cela les nombreux accesseurs
de la classe LogRecord

R. Grin

Fiabilit

154

Chane complte de traitement


Si le niveau est suffisant, une instance de
LogRecord est cre par le logger
Celui-ci repasse lenregistrement ses
handlers pour fournir le message
Si lenregistrement passe le filtre ventuel,
le formatter de chaque handler met en
forme lenregistrement sous forme dun
message de journalisation
lenregistrement est ensuite pass au parent
du logger

R. Grin

Fiabilit

155

Configuration du logging

2 faons de configurer le logging :


par un fichier de configuration indiqu lors du
lancement de lapplication :
java Djava.util.logging.config.file
=logging.conf ...

par programmation avec des mthodes diverses de


la classe Logger (addHandler, setFilter,
setLevel,) ; on peut aussi configurer les
handlers et les filtres avec les paramtres de leurs
constructeurs
R. Grin

Fiabilit

156

Configuration des niveaux


Si on ne fixe pas le niveau dun logger, il hrite
de celui de son parent
Si on a pris soin de nommer les loggers suivant
le nom des classes quils observent, il est facile
de choisir le niveau du suivi des classes ou
paquetages que lon souhaite journaliser

R. Grin

Fiabilit

157

Configuration par dfaut

Dtermine par le fichier


lib/logging.properties

plac dans le rpertoire dinstallation du JRE


Cest un fichier de proprits ordinaire (voir
exemple suivre)

R. Grin

Fiabilit

158

Quelques configurations par dfaut

Le logger racine est configur avec un


ConsoleHandler

Ds que lon cre un autre logger, les messages


sont donc envoys vers lcran (System.err
plus exactement) cause du cheminement des
LogRecord vers les parents
Le niveau par dfaut est INFO
Les File et Socket Handler ont un

XMLFormatter
R. Grin

Fiabilit

159

Configuration par dfaut (1)


# Par dfaut configure seulement un
# ConsoleHandler avec le niveau INFO
handlers= java.util.logging.ConsoleHandler
# Pour ajouter aussi un FileHandler :
#handlers=java.util.logging.FileHandler,java
.util.logging.ConsoleHandler
# Niveau global par dfaut.
# Le ConsoleHandler a un niveau spar.
.level= INFO

R. Grin

Fiabilit

160

Configuration par dfaut (2)


# Fichier de sortie dans HOME.
java.util.logging.FileHandler.pattern =
%h/java%u.log
# Pour des fichiers de logging criture
# circulaire (2 fichiers de 50000 octets)
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 2
java.util.logging.FileHandler.formatter =
java.util.logging.XMLFormatter

R. Grin

Fiabilit

161

Configuration par dfaut (3)


# Limiter les messages affichs INFO.
java.util.logging.ConsoleHandler.level =
INFO
java.util.logging.ConsoleHandler.formatter =
java.util.logging.SimpleFormatter

R. Grin

Fiabilit

162

Configuration par dfaut (4)


# On peut configurer chaque logger.
# Par exemple, indiquer que le logger
# fr.truc ne prend en compte que les
# messages dont le niveau est au-dessus
# de SEVERE :
fr.truc.level = SEVERE

R. Grin

Fiabilit

163

Exemple de fichier de
configuration (1)
# Handlers du logger racine
handlers = java.util.logging.ConsoleHandler
# Spcifie les handlers uniquement pour le
# logger de nom "test"
test.handlers = java.util.logging.FileHandler
# Niveau minimum des messages transmis
.level = ALL
# Niveaux pour les handlers
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.FileHandler.level = ALL
R. Grin

Fiabilit

164

Exemple de fichier de
configuration (2)
# Configuration du FileHandler
java.util.logging.FileHandler.pattern =
java%u.log
# Sa taille ne dpassera pas 50000 octets
java.util.logging.FileHandler.limit = 50000
# 2 fichiers de logging
java.util.logging.FileHandler.count = 2
# Le contenu du fichier sera du XML
java.util.logging.FileHandler.formatter =
java.util.logging.XMLFormatter
R. Grin

Fiabilit

165

Rapidement, comment faire ? (1/2)

Pour chaque classe que lon veut suivre,

import java.util.logging.*;
private static Logger logger =
Logger.getLogger("fr.p1.Classe");

Dans les mthodes suivies :


logger.info("Message dinformation");
logger.warning("Avertissement");

R. Grin

Fiabilit

166

Rapidement, comment faire ? (2/2)

Positionner le niveau de sortie des messages et


les autres options dans un fichier de proprits lu
par le code (et utilis lors de la cration des
handlers par exemple) ou dsign au lancement
de lapplication par la proprit
java.util.logging.config.file
(java -Djava.util.logging.config.file)

R. Grin

Fiabilit

167