Gestion des exceptions

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/except qui 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 ?

1.
La ligne "soft drinks" est remplacée par "3-4 soft drinks".
  1. FileNotFoundError
  2. IndexError
  3. ValueError
2.
for line in open("food_order.text"):
  1. FileNotFoundError
  2. IndexError
  3. ValueError
3.
parts = line.split()
qty = parts[0]
item = parts[1]
  1. FileNotFoundError
  2. IndexError
  3. ValueError

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 ?

4.
word = "one"
try:
  number = int(word)
  print(word, "equals", number)
except ValueError:
  print(word, "is not a number")
  1. one equals 1
  2. one is not a number
  3. ValueError: invalid literal for int() with base 10: 'one'
5.
word = "one"
try:
  number = int(word)
  print(word, "equals", number)
except IndexError:
  print(word, "is not a number")
  1. one equals 1
  2. one is not a number
  3. ValueError: invalid literal for int() with base 10: 'one'
6.
word = "one"
try:
  char = word[3]
  print("The char is", char)
except:
  print("That didn't work")
  1. The char is e
  2. That didn't work
  3. IndexError: string index out of range

À 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 :

  1. Essayer de convertir la chaîne en un entier. Si aucune exception ValueError n'est levée, alors la chaîne représente un entier.
  2. Sinon, essayer de convertir la chaîne en un flottant. Si aucune exception ValueError n'est levée, alors la chaîne représente un flottant.
  3. 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.