Erreurs d`exécution (1/3)

publicité
Erreurs d'exécution (1/3)
Dans tout programme, il peut y avoir des erreurs d'exécution non critiques
Exemple : le programme est en train de lire un fichier et il y a un problème
d'accès au disque dur.
NB : il ne s'agit ni d'erreur de programmation, que le compilateur peut détecter, ni
d'erreur critique qui empêche la suite de l'exécution.
Quand il y a une erreur non critique, on voudrait que le programme ne plante pas
complètement et puisse récupérer de cette erreur et continuer.
Exemple : s'il y a un échec de lecture d'un fichier, le programme doit continuer en
retentant la lecture ou en passant à autre chose.
Licence Informatique - Semestre 2 - Algorithmique et Programmation
1
Erreurs d'exécution (2/3)
Les erreurs se produisent dans un contexte d'exécution mais peuvent
influer sur les contextes englobant.
programme EditeurDeTexte
...
début
…
si (clic sur le bouton « ouvrir fichier ») alors
...
chaine c ← lireFichier(...);
...
fin
chaine fonction lireFichier(chaine nomFichier)
...
début
…
chaine d ← lireLigne(...) ;
...
chaine fonction lireLigne(chaine nomFichier, entier ligne)
fin
...
début
...
// accès disque
...
fin
Licence Informatique - Semestre 2 - Algorithmique et Programmation
2
Erreurs d'exécution (3/3)
Le principe d’endiguement :
- un programme est une hiérarchie de contextes d’exécution
- une erreur d'exécution récupérable doit être récupérée à un certain
niveau pour éviter la plante complète du programme
- pour déléguer le traitement d'une erreur d'un contexte d'exécution à
l'autre, il faut pouvoir transférer une description de l'erreur (exception)
main
une erreur
un contexte d’exécution
le contexte d’exécution qui
traite l'erreur
Licence Informatique - Semestre 2 - Algorithmique et Programmation
3
Exception
Une exception décrit une erreur : son type, les données qui ont provoqué
l'erreur, etc
Exception e = …
System.out.println(e.getMessage()); // écrit le message de l'erreur
e.printStackTrace(); // affiche la trace de l'exécution qui a mené à l'erreur
En Java, il existe tout un tas de types d'exception : IOException,
ArithmeticException,ArrayIndexOutOfBoundsException, …
En Java, il est possible de créer ses propres types d'exception :
/** Exception lancée en cas de bombardement nucléaire */
public class AtomicBombingException extends Exception{
public AtomicBombingException(){
super("Erreur due à une destruction totale de l'ordinateur");
}
}
Licence Informatique - Semestre 2 - Algorithmique et Programmation
4
Lancement des exceptions
Si on écrit une fonction qui peut lancer une exception, on doit le préciser dans
son en-tête :
String lireLigne(String nomFichier, int ligne) throws IOException
{
...
if(...){ // accès disque impossible
throw new IOException("Impossible d'accéder à ce #@$! disque");
}
...
}
Licence Informatique - Semestre 2 - Algorithmique et Programmation
5
Traitement des exceptions
try{ // bloc de code contenant une instruction pouvant lancer une exception
...
String s = lireLigne("fichier.txt",12);
...
}
catch(IOException e){ // récupération d'une exception de type IO
System.out.println(e.getMessage());
}
catch(FileNotFoundException e){
e.printStackTrace();
}
finally{ // bloc de code exécuté qu'il y ait exception ou pas
...
}
L'appel à une fonction susceptible de lancer une exception doit être réalisé
dans un bloc try.
Un seul bloc catch est exécuté, le premier rencontré qui correspond au type
de l'exception.
Le bloc finally est toujours exécuté mais il est optionnel.
Licence Informatique - Semestre 2 - Algorithmique et Programmation
6
Flux (1/2)
un flux (stream) est un mécanisme qui encapsule la transmission de
données, en lecture ou en écriture, entre un programme et d'autres
programmes, fichiers ou dispositifs
flux en écriture sur
une imprimante
flux en écriture
sur un écran
programme en train
de s'exécuter
flux en lecture
sur un clavier
flux en écriture sur
un programme
flux en lecture
sur un fichier
fichier
toto
Licence Informatique - Semestre 2 - Algorithmique et Programmation
programme en train
de s'exécuter
sur une autre machine
7
Flux (2/2)
Un flux permet une gestion (quasi)-uniforme de ces transmissions de
données.
Exemple : du point de vue du programmeur, écrire une chaine de caractère à
l'écran, dans un fichier situé sur une autre machine d'un réseau ou sur une
imprimante se fait (quasiment) de la même manière.
Des flux par défaut existent en Java :
System.in est un flux en lecture sur le clavier
System.out est un flux en écriture sur l'écran
On distingue les flux d'entrée (les données arrivent de l'extérieur du
programme) et les flux de sortie (les données sont envoyées à l'extérieur du
programme).
Licence Informatique - Semestre 2 - Algorithmique et Programmation
8
Flux en lecture sur un fichier (1/2)
try{
FileReader fr = null;
try{
fr = new FileReader("monfichier.truc"); // ouvre le flux et
se positionne au début
while(fr.ready()){
int c = fr.read(); // lit un caractère comme entier entre 0 et 65535
fr.skip(23); // saute 23 caractères
fr.mark(12); // pose une marque sur le caractère courant, qui
sera marqué tant que 12 octets n'auront pas été lus
...
fr.reset(); // repositionne le flux au dernier caractère marqué. Si
aucun caractère n'est marqué, une IOException est lancée)
...
}
}
catch(FileNotFoundException e){System.out.println("fichier introuvable!");}
catch(IOException e){System.out.println("Problème d'entrée sortie : "
+e.getMessage());}
finally{
if(fr != null) fr.close(); // ne pas oublier de fermer le flux
}
}
catch(IOException e){System.out.println("Problème d'entrée sortie : "
+e.getMessage());}
Licence Informatique - Semestre 2 - Algorithmique et Programmation
9
Flux en lecture sur un fichier (2/2)
try{
FileReader fr = null;
BufferedReader br = null;
try{
fr = new FileReader("monfichier.truc");
br = new BufferedReader(fr); // met le flux dans un tampon
while(br.ready()){
int c = br.read(); // lit un caractère comme entier entre 0 et 65535
String s = br.readLine(); // lit une ligne entière
...
}
}
catch(FileNotFoundException e){
System.out.println("fichier introuvable!");
}
catch(IOException e){
System.out.println("Problème d'entrée sortie : "+e.getMessage());
}
finally{
if(br != null) br.close();
if(fr != null) fr.close(); // ne pas oublier de fermer le flux
}
}
catch(IOException e){
System.out.println("Problème d'entrée sortie : "+e.getMessage());
}
Licence Informatique - Semestre 2 - Algorithmique et Programmation
10
Flux en écriture sur un fichier
try{
FileWriter fw = null;
try{
fw = new FileWriter("monfichier.ext"); // ouvre le flux
fw.write(75); // écrit un 'K' dans le fichier
…
fw.write('\n'); // écrit un saut de ligne dans le fichier
...
String s = "Bonjour le monde";
fw.write(s,3,6); // écrit "jour l" dans le flux
...
}
catch(FileNotFoundException e){
System.out.println("fichier introuvable!");
}
catch(IOException e){
System.out.println("Problème d'entrée sortie : "+e.getMessage());
}
finally{
if(fw != null) fw.close(); // ne pas oublier de fermer le flux
}
}
catch(IOException e){
System.out.println("Problème d'entrée sortie : "+e.getMessage());
}
Licence Informatique - Semestre 2 - Algorithmique et Programmation
11
Pour aller plus loin
D'autres classes de l'API Java permettent de gérer les flux et les fichiers de
façon bien plus compliquée mais bien plus puissante.
La documentation de l'API Java :
http://docs.oracle.com/javase/7/docs/api/
Le tutoriel java concernant la gestion des entrées-sorties :
http://java.sun.com/docs/books/tutorial/essential/io/index.html
Pour l'encodage des caractères, voir le site de l'UNICODE :
www.unicode.org/charts/PDF/U0000.pdf pour les codes ASCII
unicode.org en général pour l'encodage
Licence Informatique - Semestre 2 - Algorithmique et Programmation
12
Téléchargement