Gestion des exceptions¶
Bloc try/except¶
On peut gérer (ou attraper) une exception en utilisant un bloc
try/except
et le nom d’une classe d’exception :
try:
a = 1 / 0
except ZeroDivisionError:
print("Quelqu'un a essayé de diviser par zéro!")
# affiche: Quelqu'un a essayé de diviser par zéro!
À noter : Le bloc dans try
s’interrompt dès qu’une exception est levée,
et on ne passe dans le bloc except
que si une exception est effectivement
levée.
x = 14
y = 0
try:
z = x / y
print("z vaut", z)
except ZeroDivisionError:
print("Quelqu'un a essayé de diviser par zéro!")
# affiche: Quelqu'un a essayé de diviser par zéro!
Notez que la ligne print("z vaut", z)
n’a pas été exécutée.
Autre exemple :
x = 14
y = 2
try:
z = x / y
print("z vaut", z)
except ZeroDivisionError:
print("Quelqu'un a essayé de diviser par zéro!")
# affiche: 'z vaut 7.0'
Notez que la ligne print("Quelqu'un a essayé de diviser par zéro!")
n’a pas
été exécutée.
Gestion de plusieurs exceptions¶
Le mot après except
doit être celui d’une classe, et l’exception n’est gérée
que si sa classe est égale ou une fille de celle-ci.
Par exemple, ceci fonctionne car ZeroDivisionError
est bien une fille
de la classe ArithmeticError
:
x = 14
y = 0
try:
z = x / y
print("z vaut", z)
except ArithmeticError:
print("Quelqu'un a essayé une opération impossible")
On peut aussi mettre plusieurs blocs de except
:
try:
tente_un_truc_risqué()
except ZeroDivisionError:
print("raté : division par zéro!")
except FileNotFoundError:
print("raté : fichier non trouvé")
Ou gérer des exceptions de classes différentes avec le même bloc :
try:
tente_un_truc_risqué()
except (ZeroDivisionError, FileNotFoundError)
print("raté!")
Accéder à la valeur de l’exception¶
On peut récupérer l’instance de l’exception levée avec le mot-clé as
:
try:
ouvrir_fichier()
except FileNotFoundError as e:
print("le fichier: ", e.filename, "n'existe pas")
Ici on utilise l’attribut filename
de la classe FileNotFoundError
pour afficher un message d’erreur.