14.4 Gestion des exceptions
Objectifs d'apprentissage
À la fin de cette section, vous devriez être capable de :
- Décrire deux exceptions pouvant survenir lors de la lecture de fichiers.
- Écrire des instructions
try/exceptqui gèrent les exceptions intégrées.
Erreurs d'exécution
Diverses erreurs peuvent se produire lors de la lecture d'un fichier :
FileNotFoundError: Le nom de fichier ou le chemin d'accès n'est pas valide.IndexError/ValueError: Le format du fichier n'est pas valide.- D'autres erreurs causées par un contenu non valide dans un fichier.
Lorsqu'une erreur survient, le programme s'arrête en affichant un message d'erreur.
Exemple 14.4
Coquille dans un fichier
Un fichier nommé food_order.txt contient ce qui suit :
5 sandwiches
4 chips
1 pickle
soft drinks
Le programme suivant s'attend à ce que chaque ligne du fichier commence par un entier :
for line in open("food_order.txt"):
space = line.index(" ")
qty = int(line[:space])
item = line[space+1:-1]
print(qty, item)
Malheureusement, la ligne "soft drinks" ne commence pas par un entier. Par conséquent, le programme s'interrompt et affiche un message d'erreur :
Traceback (most recent call last):
File "food_order.py", line 3
qty = int(line[:space])
ValueError: invalid literal for int() with base 10: 'soft'
Concepts en pratique
Exceptions courantes
Quelle erreur pourrait survenir dans chaque situation ?
Pour aller plus loin
La page Built-in Exceptions de la bibliothèque standard de Python explique la signification de chaque exception.
Try et except
Les programmes peuvent être conçus pour gérer les exceptions au lieu de s'interrompre. Une instruction try exécute du code qui pourrait lever une exception. Une clause except exécute du code en réponse à l'exception.
Exemple 14.5
Tenter d'ouvrir un fichier
Le programme suivant, nommé try_open.py, demande un nom de fichier à l'utilisateur et compte le nombre de lignes dans le fichier.
name = input("Enter a filename: ")
try:
file = open(name)
lines = file.readlines()
count = len(lines)
print(name, "has", count, "lines")
except FileNotFoundError:
print("File not found:", name)
print("Have a nice day!")
Lors de l'exécution de ce programme avec l'entrée try_open.py, le nom du fichier du programme, la sortie est :
Enter a filename: try_open.py
try_open.py has 9 lines
Have a nice day!
Si le nom de fichier n'existe pas, une exception FileNotFoundError est levée à la ligne 3. Le programme passe alors à la clause except à la ligne 7 et continue son exécution. La sortie obtenue est :
Enter a filename: try_open.txt
File not found: try_open.txt
Have a nice day!
Concepts en pratique
Prédire la sortie avec des exceptions
Pour chaque extrait de code, quelle est la sortie ?
À vous d'essayer
Analyseur de types
Les programmes d'analyse ont souvent besoin d'extraire des nombres de grands corpus de texte. Comment un programme peut-il déterminer si une chaîne comme "123.45" représente un nombre ? Une méthode consiste à utiliser les exceptions :
- Essayer de convertir la chaîne en un entier. Si aucune exception
ValueErrorn'est levée, alors la chaîne représente un entier. - Sinon, essayer de convertir la chaîne en un flottant. Si aucune exception
ValueErrorn'est levée, alors la chaîne représente un flottant. - Sinon, la chaîne ne représente pas un nombre.
Implémentez la fonction get_type() à l'aide de cette méthode. Le bloc principal fourni appelle get_type() pour chaque mot d'un fichier. get_type() doit renvoyer soit "int", "float", ou "str", selon le mot. La sortie pour le fichier data.txt fourni est :
str: Hello
int: 100
str: times!
float: 3.14159
str: is
str: pi.
À vous d'essayer
Pays unis
Écrivez un programme qui invite l'utilisateur à saisir un mot et un nom de fichier. Le programme doit afficher chaque ligne du fichier contenant ce mot. Voici un exemple d'exécution du programme (les entrées de l'utilisateur sont en gras) :
Enter a word: United
Enter a filename: countries.csv
United Arab Emirates,9890402,83600,118
United Kingdom,67886011,241930,281
United States of America,331002651,9147420,36
Cet exemple utilise un fichier nommé countries.csv basé sur la liste alphabétique des pays de Worldometer. Chaque ligne du fichier comprend le nom d'un pays, sa population, sa superficie et sa densité de population, séparés par des virgules.
L'utilisateur pourrait faire une erreur de saisie dans le nom du fichier (Ex. : countries.txt au lieu de countries.csv). Votre programme doit afficher un message d'erreur si le fichier n'est pas trouvé, et continuer d'inviter l'utilisateur à saisir un nom de fichier jusqu'à ce que le fichier soit trouvé :
...
Enter a filename: countries
File not found: countries
Enter a filename: countries.txt
File not found: countries.txt
Enter a filename: countries.csv
...
Indication : Essayez d'ouvrir le fichier indiqué par l'utilisateur. Une exception FileNotFoundError est levée si le nom de fichier n'est pas valide.