Les exceptions
Comment gérer les erreurs en Python ?
Division des enseignements en informatique
Rappel : les erreurs
Prenons un fichier contenant le code python suivant :
def une_fonction ( a ) :
return 1 / a
def un e_ au tre _f onction () :
une_fonction (0)
une_ au tr e_ fo nc tion ()
2
Rappel : les erreurs
L’exécution de ce scripte provoque l’erreur suivante :
Traceback ( most recent call last ) :
File " script . py " , line 7 , in < module >
un e_ au tr e_ fonction ()
File " script . py " , line 5 , in une_autre_fonction
une_fonction (0)
File " script . py " , line 2 , in une_fonction
return 1 / a
Zero Divisi onError : division by zero
Comment lire les erreurs
Un message d’erreur se lit de bas en haut ! Ainsi on peut
remonter la pile des appels.
3
Erreurs et exceptions
Sous l’erreur ci dessus, se cache en réalité une exception de type
ZeroDivisionError.
Qu’est ce qu’une exception ?
Mécanisme pour gérer des erreurs survenues lors de l’exécution
d’un programme.
4
Gestion des exceptions
Pourquoi faut-il gérer certaines exceptions ?
• Apporter une solution à un problème bloquant
• Éviter d’interrompre le programme
Il existe d’autres solutions, mais c’est la manière de faire en
Python :
def une_fonction ( a ) :
# Gestion de l ’ erreur en amont
if a == 0:
print ( " Division par 0 impossible ! " )
return None
else :
return 1 / a
5
Soulever une exception
Des exceptions sont automatiquement levées par les fonctions
built-in de python, cependant, il est possible de lever ses propres
exception à l’aide du mot-clef raise.
def ma_fonction ( age ) :
if age < 0:
raise ValueError ( " ’ age ’ doit etre positif
!")
# suite de la fonction
>>> ma_fonction ( -2)
Traceback ( most recent call last ) :
File " < interactive input > " , line 1 , in < module >
File " < interactive input > " , line 3 , in
ma_fonction
ValueError : ’ age ’ doit etre positif !
6
Traiter une exception
On utilise la combinaison de mots-clef try/except pour créer des
blocs d’instructions, où les instructions pouvant mener à une
erreur, pourront être gérées.
try :
# ce qui peut produire une exception
except NomException :
# ce qu ’ il faut faire si l ’ exception se d é
clanche
7
Traiter une exception
On utilise la combinaison de mots-clef try/except pour créer des
bloques d’instructions où les instructions pourront être gérées.
Exemple :
liste = [ ’ toto ’ , ’ titi ’ , ’ tata ’ ...]
i = int ( input () )
try :
choix = liste [10 // i ]
except Zer oDivisionError :
print ( " Division par zero impossible " )
choix = liste [0]
except IndexError :
print ( " Probleme d ’ index " )
choix = liste [ len ( liste ) ]
8
Traiter une exception
Mots-clef finally et else :
try :
# ce qui peut produire une exception
except NomException :
# ce qu ’ il faut faire si l ’ exception se d é
clenche
else :
# ce qu ’ il faut faire si aucune exception n ’a
é t é lev é e
finally :
# ce qui sera ex é cut é dans tous les cas
9
Traiter une exception
Mots-clef finally et else :
Exemple :
try :
f = open ( ’ fichier . txt ’ , ’w ’)
# é criture dans le fichier
except IOError :
print ( " Probleme lors de l ’é criture du fichier
")
else :
print ( " Ecriture OK " )
finally :
f . close ()
10
Cas des fichiers
Astuce contre les oublis de fermeture, le mot-clef with :
try :
with open ( ’ fichier . txt ’ , ’w ’) as f :
# é criture dans le fichier
except ( IOError , FileNotFoundError ) :
# g é rer l ’ erreur
11
Exceptions fréquentes
• NameError : variable ou fonction manipulée non déclarée
• TypeError : type de la variable incohérent avec l’opération
demandée
• ValueError : le type est correct, mais pas la valeur
• ZeroDivisionError : division par zéro
• IndexError / KeyError : tentative d’accès à une
séquence/dictionnaire avec un indice/clé inexistant
• FileNotFoundError : le fichier n’existe pas
• IOError : erreur lors de la manipulation d’un fichier
• SyntaxError : erreur de syntaxe (indentation, parenthèse...)
12