3 – Les exceptions
INF2 – P26
1 – Les exceptions
1 . 1 – P OUR Q UOI FA I RE ?
1 . 2 – HI ÉRA RC HI E D ES EXC EPT I ON S
1 . 3 – T RA I T ER UNE EXC EPT I ON
1 . 4 – L EVER UNE EXC EPT I ON
INF2 - P26 COURS 3 - EXCEPTIONS 2
1.1 – Pour quoi faire ?
Certaines instructions en Python peuvent générer des erreurs lors de leur exécution.
Ces erreurs sont représentées par une exception.
Par exemple, ce code génère une exception qui n’est pas traitée :
def une_betise(a):
return a / 0
une_betise(12)
Traceback (most recent call last):
File ‘[Link]’, line 4, in <module>
une_betise(12) Pile d’appels
File ‘[Link]’, line 2, in une_betise
return a / 0
~~^~~
ZeroDivisionError: division by zero Type d’exception et message d’erreur
INF2 - P26 COURS 3 - EXCEPTIONS 3
1.2 – Hiérarchie des exceptions
La « maman » de toutes les exceptions en python s’appelle BaseException.
[Link]
Dans le cadre de INF2, nous ne manipulerons pas d’exception au-dessus de
Exception.
A chaque erreur son exception :
• Division par zéro à ZeroDivisionError
• Racine carré d’un nombre négatif à ValueError
• Clé de dictionnaire non existante à KeyError
• Indice non existant dans une liste à IndexError
• Multiplication de 2 str à TypeError
• …
INF2 - P26 COURS 3 - EXCEPTIONS 4
1.3 – Traiter une exception
L’arrêt du programme avec un grand message rouge c’est bien mais parfois on peut traiter le
problème J
En Python on utilise la structure de contrôle try – except – else - finally
SYNTAXE
try:
actions susceptibles de lancer une exception
except (exception1, exception2, …) as ex:
actions de gestion de lʹexception de type 1 ou 2
except (exception3, exception4, …) as ex:
actions de gestion de lʹexception de type 3 ou 4
else:
si on a aucune erreur
finally:
actions toujours exécutées quʹil y ait une exception ou pas
INF2 - P26 COURS 3 - EXCEPTIONS 5
1.3 – Traiter une exception
IMPORTANT
L’exécution du code dans le bloc try prend fin dès qu’une exception est rencontrée.
On passe alors immédiatement au bloc except correspondant.
EXEMPLE
try:
numerateur = int(input("Entrer le numérateur : "))
denominateur = int(input("Entrer le denominateur : "))
res = numerateur / denominateur
except ValueError:
print("La valeur entrée n'est pas un entier")
except ZeroDivisionError:
print("Eh oh ! On divise pas par zéro") L’entrée du numérateur se passe bien
else: L’entrée du dénominateur plante
print(f"Le résultat est : {res}")
(conversion en entier impossible)
finally:
print("Plus rien à faire !")
à On arrête l’exécution et on passe au
except, le calcul ne sera jamais fait
INF2 - P26 COURS 3 - EXCEPTIONS 6
1.3 – Traiter une exception
Parfois, il n’y a pas de traitement différencié à appliquer en fonction de l’erreur.
Pour afficher le message d’erreur tel qu’il a été écrit par le développeur, un simple print sur
l’exception suffit :
EXEMPLE
try:
numerateur = int(input("Entrer le numérateur : "))
denominateur = int(input("Entrer le denominateur : "))
res = numerateur / denominateur
except (ValueError, ZeroDivisionError) as e:
print(e)
else:
print(f"Le résultat est : {res}")
finally:
print("Plus rien à faire !")
INF2 - P26 COURS 3 - EXCEPTIONS 7
1.4 – Lever une exception
On sait gérer un code qui plante, plaçons-nous « de l’autre côté ». Il est intéressant d’informer
l’utilisateur de notre code sur l’erreur que l’on rencontre.
Ce mécanisme est la levée d’exception.
SYNTAXE
raise MonException(‘des détails’)
EXEMPLE
try:
nb_etu = int(input("Nombre d'étudiants en INF2 ? "))
if nb_etu < 0:
raise ValueError("Impossible qu'ils soient moins de 0 !")
# ...
except ValueError as e:
print(e)
INF2 - P26 COURS 3 - EXCEPTIONS 8