3.2. La gestion des exceptions

Lorsque nous savons qu’une partie du code est susceptible de déclencher des exceptions, il est possible de la placer dans un bloc d’instructions try, qui doit impérativement être suivit d’un bloc d’instructions except. L’interprète essaie alors d’exécuter le code contenu dans le bloc try et, si une exception est rencontrée, l’exécution est interrompue et reprend au début du bloc except sans pour autant mettre fin au programme.

while True:
    try:
        n = float(input("Veuillez entrer un nombre : "))
        print(f"L'inverse du nombre est : {1/n}")
    except:
        print("Un erreur est survenue")
Veuillez entrer un nombre : 1
L'inverse du nombre est : 1.0
Veuillez entrer un nombre : un
Un erreur est survenue
Veuillez entrer un nombre : 0
Un erreur est survenue
...

Nous pouvons utiliser plusieurs blocs except afin de filtrer les exceptions. Dans ce cas, il faut indiquer la classe des erreurs (qui sont bien entendu des objets) à traiter pour chaque block except, sauf pour le dernier qui se charge de toutes les exceptions non filtrées.

while True:
    try:
        n = float(input("Veuillez entrer un nombre : "))
        print(f"L'inverse du nombre est : {1/n}")
    except ValueError:
        print("Un erreur de type ValueError est survenue")
    except ZeroDivisionError:
        print("Un erreur de type ZeroDivisionError est survenue")
    except:
        print("Une autre erreur est survenue")
Veuillez entrer un nombre : 1
L'inverse du nombre est : 1.0
Veuillez entrer un nombre : 0
Un erreur de type ZeroDivisionError est survenue
Veuillez entrer un nombre : un
Un erreur de type ValueError est survenue
...

Il est possible de mémoriser l’objet représentant l’erreur en utilisant le mot réservé as après l’instruction except Cela permet d’y accéder par la suite, par exemple pour obtenir plus d’informations sur ses propriétés ou sa cause.

Lorsque l’on souhaite utiliser un bloc except pour traiter plusieurs sortes d’erreurs, on peut indiquer que l’exception est de type Exception dont héritent toutes les classes d’exceptions. Grâce à la fonction type(), on peut ensuite obtenir la classe précise de l’exception.

while True:
    try:
        n = float(input("Veuillez entrer un nombre : "))
        print(f"L'inverse du nombre est: {1/n}")
    except Exception as e:
        print(f"Un erreur de type {type(e)} est survenue"))
Veuillez entrer un nombre : 1
L'inverse du nombre est : 1.0
Veuillez entrer un nombre : 0
Un erreur de type <class 'ZeroDivisionError'> est survenue
Veuillez entrer un nombre : un
Un erreur de type <class 'ValueError'> est survenue
...