Gestion des exceptions
Intéressons-nous au script suivant :
# script inverse.py
chaine = input('Entrer un nombre : ')
nombre = float(chaine)
inverse = 1.0/nombre
print("L'inverse de", nombre, "est :", inverse)
Ce script vous demande de saisir un nombre, puis il calcule et affiche son inverse.
Les exceptions
Quand vous entrez un nombre, tout se déroule normalement :
>>>
Entrer un nombre : 10
L'inverse de 10.0 est : 0.1
>>>
Mais que se passe-t-il autrement ?
>>>
Entrer un nombre : bonjour
Traceback (most recent call last):
File "inverse.py", line 3, in <module>
nombre = float(chaine)
ValueError: could not convert string to float: bonjour
>>>
>>>
Entrer un nombre : 0
Traceback (most recent call last):
File "inverse.py", line 4, in <module>
inverse = 1.0/nombre
ZeroDivisionError: float division by zero
>>>
Python a détecté une erreur : une exception est levée.
Ici nous avons une exception de type ZeroDivisionError (division par 0) et une exception de type ValueError.
Une exception arrête l'exécution normale d'un programme.
Gestion des exceptions
Heureusement, il est possible de gérer les exceptions pour éviter l'arrêt brutal du programme.
Par cela, on utilise conjointement les instructions try et except.
L'instruction else est optionnelle :
try:
chaine = input('Entrer un nombre : ')
nombre = float(chaine)
inverse = 1.0/nombre
except:
#ce bloc est exécuté si une exception est levée dans le bloc try
print("Erreur !")
else:
#on arrive ici si aucune exception n'est levée dans le bloc try
print("L'inverse de", nombre, "est :", inverse)
>>>
Entrer un nombre : 56
L'inverse de 56.0 est : 0.0178571428571
>>>
Entrer un nombre : 0
Erreur !
>>>
On peut distinguer les différents types d'exceptions :
try:
chaine = input('Entrer un nombre : ')
nombre = float(chaine)
inverse = 1.0/nombre
except ValueError:
#ce bloc est exécuté si une exception de type ValueError est levée dans le bloc try
print(chaine, "n'est pas un nombre !")
except ZeroDivisionError:
#ce bloc est exécuté si une exception de type ZeroDivisionError est levée dans le bloc try
print("Division par zéro !")
else:
#on arrive ici si aucune exception n'est levée dans le bloc try
print("L'inverse de", nombre, "est :", inverse)
>>>
Entrer un nombre : 0
Division par zéro !
>>>
Entrer un nombre : bonjour
bonjour n'est pas un nombre !
>>>
N'oubliez pas : un programme bien écrit doit gérer proprement les exceptions.