UVT MASTER BADS
M 8
PYTHON
Les exceptions
Enseignante: Mme Lamia MANSOURI
Ann e universitaire: 2020-2021
1
1. Pr sentation des exceptions
2
" Comme d'autres langages, Python fournit galement la gestion d'exceptions l'aide de try-except.
" Pour les erreurs d tect es lors de l'ex cution, il va falloir mettre en place un syst me de gestion derreurs qui
indiquera au Python quoi faire si telle ou telle erreur est rencontr e.
"
Il est essentiel de fournir une gestion des erreurs denvironnement afin de garantir que le script ne plante pas
dans certaines situations et pour garantir lint grit et la s curit des donn es ainsi quune bonne exp rience
pour lutilisateur qui na pas envie de voir des messages derreur Python.
Il y a deux sortes d'erreurs:
Erreur de syntaxe : galement appel e erreur danalyse, la plus l mentaire. Appara t lorsque l'analyseur
Python est incapable de comprendre une ligne de code.
Exception: erreurs d tect es lors de l'ex cution. par exemple: ZeroDivisionError, TypeError.
" Une exception est dite lev e lorsquune erreur apparait.
" Une exception est dite captur e lorsquelle est g r e et trait e.
Le m canisme des exceptions permet donc au programme de "rattraper" les erreurs, de d tecter
quune erreur sest produite et dagir en cons quence an que le programme ne sarr te pas.
Dans Python , il existe deux types dexception :
celles pr sentent dans la table des exceptions de Python
celles cr es par lutilisateur
3
4
Si on essaye de d clencher des erreurs manuellement, on peut constater que Python analyse le
type derreur et renvoie un message diff rent selon lerreur d tect e :
Diff rents types dexceptions
2. M canisme des exceptions
Le m canisme des exceptions permet au programme de "rattraper" les erreurs, de d tecter
quune erreur sest produite et dagir en cons quence an que le programme ne sarr te pas.
2.1 Instruction try-except
Comment fonctionne try()?
Syntaxe:
La premi re clause try est ex cut e, c'est- -dire le code
try: # On test un bout de code
Code tester
except:
Code xecut en cas d'erreur
entre try et except clause.
S'il n'y a pas d'exception, alors seule la clause try sera
ex cut e.
Si une exception survient, la clause try sera ignor e et la
clause except sera ex cut e.
Si une exception se produit, mais que la clause except ne la
g re pas, elle est transmise aux instructions try externes.
Si l'exception n'est pas g r e, l'ex cution s'arr te.
Une instruction try peut avoir plus d'une clause except
5
Exemples :
try:
6
resultat = numerateur / denominateur
except NameError:
print( "La variable num rateur ou d nominateur n'a pas t d finie. ")
except TypeError:
print("Le num rateur ou d nominateur est d'un type incompatible avec une division. ")
except ZeroDivisionError:
print("La variable d nominateur est gale a 0. " )
valid = False
while not valid:
an = input(" Ann e de naissance ? ")
try:
an=int(an)
if 0 <= an <= 2020:
valid = True
Publicité
else:
print("L'ann e doit tre comprise entre 0 et 2020.")
except :
print(" Veuillez entrer un nombre naturel. ")
print(" Tu as ", 2020 - an, " ans. ")
Le type Exception
7
Dans un programme , diff rents types d'erreurs peuvent survenir. Lorsqu'on utilise l'instruction try-except,
le bloc except capture toutes les erreurs possibles qui peuvent survenir dans le bloc try correspondant.
Une exception est en fait repr sent e par un objet, instance de la classe Exception.
On peut r cup rer cet objet en pr cisant un nom de variable apr s except comme dans cet exemple :
try:
a = int(input('a : '))
b = int(input('b : '))
print(a, '/', b, '=', a / b)
except Exception as e:
print(type(e))
print(e)
On r cup re donc l'objet de type Exception dans la variable e. Dans
le bloc except, on affiche son type et sa valeur.
Voici deux exemples d'ex cution :
si on ne fournit pas un nombre entier, il ne pourra tre converti en
int et une erreur de type ValueError se produit :
a : trois
<class 'ValueError'>
invalid literal for int() with base 10: 'trois
si on fournit une valeur de 0 pour b, on aura une division par z ro
qui produit une erreur de type ZeroDivisionError :
a : 5
b : 0
<class 'ZeroDivisionError'>
division by zero
8
Il est possible d'ex cuter le m me code pour diff rents types d'erreurs, en les listant dans un tuple apr s le
mot r serv except.
Si on souhaite ex cuter le m me code pour une erreur de conversion et de division par z ro, il faudrait
crire :
try:
a = int(input('a : '))
b = int(input('b : '))
print(a, '/', b, '=', a / b)
except (ValueError, ZeroDivisionError) as e:
print('Erreur de calcul :', e)
except:
print('Autre erreur.')
Le 1er bloc except capture donc les erreurs de type
ValueError et ZeroDivisionError. L'exception captur e
est stock e dans la variable e que l'on affiche pour
avoir des informations sur la cause de l'erreur apparue.
Exemple dex cution du programme :
a : 2
b : 0
Erreur de calcul : division by zero
2.2 La clause else
9
Syntaxe:
try: # On test un bout de code
Code tester
except:
Code ex cut en cas d'erreur
else:
#Code else
2.3 la clause Finally
Syntaxe:
try :
Code tester
except Exception as e :
Code ex cut en cas d'erreur
finally :
Le bloc finally est toujours ex cut .
Publicité
Le code entre dans le bloc else uniquement si la clause try
ne d clenche pas d'exception.
La gestion des exception compl te est try-except-finally.
Le bloc finally est toujours ex cut , que l'exception se
produise ou non dans le bloc try.
10
Syntaxe compl te :
Exemple :
2.4 Lever une exception
11
Linterpr teur est responsable de la lev e de toutes les exceptions voqu es jusqu pr sent.
Ces exceptions r sultent de la rencontre derreurs lors de lex cution.
Un programmeur peut lui aussi souhaiter lancer une exception face une entr e erron e par
exemple gr ce linstruction raise.
Plusieurs m thodes pour lutilisation de raise :
M thode 1:
raise exception_type(message)
M thode 2
def inverse(x):
if x == 0:
def inverse(x):
if x == 0:
raise ValueError("valeur nulle interdite!!")
raise ValueError
y = 1.0 / x
return y
y = 1.0 / x
return y
try:
print(inverse(0)) # erreur
except ValueError as exc:
print("erreur, message :", exc)
try:
print(inverse(0)) # erreur
except ValueError:
try:
print(inverse(0)) # erreur
except :
print("erreur de type ValueError")
print("erreur, message :")
M thode 3
def inverse(x):
if x == 0:
raise
y = 1.0 / x
return y
2.5 Propagation des erreurs
12
Que se passe-t-il lorsqu'on ne capture pas une exception l'aide d'une instruction try-except ?
Cette derni re va en fait remonter la s quence des appels de fonctions.
Prenons, par exemple, le programme suivant qui comporte deux fonctions, appel es en chaine :
Traceback (most recent call last):
File "program.py", line 7, in <module>
compute()
File "program.py", line 5, in compute
fun()
File "program.py", line 2, in fun
print(1 / 0)
ZeroDivisionError: division by zero
Le programme appelle la fonction compute qui, elle-
m me, appelle la fonction fun.
Cette derni re produisant une erreur cause de la
division par z ro.
Erreur!!!
Dans ce cas, l'erreur qui est g n r e dans la fonction
fun va juste se propager dans la fonction compute o
elle sera arr t e par l'instruction try-except.
def fun():
print(1 / 0)
def compute():
Publicité
fun()
compute()
def fun():
print(1 / 0)
def compute():
try:
fun()
except:
print('Erreur!!!')
compute()
2.6 Instructions try, except imbriqu es
13
Il est possible dimbriquer les portions prot g es de code les unes dans les autres.
Dans lexemple qui suit, la premi re erreur est lappel une fonction non d finie, ce qui d clenche
lexception NameError.
Exemple 1
def inverse(x):
y = 1.0 / x
return y
try:
try:
Exemple 2
def inverse(x):
y = 1.0 / x
return y
try:
try:
print(inverses(0)) # fonc. inexistante --> exception NameError
print(inverse(0)) # division par z ro --> ZeroDivisionError
print(inverse(0)) # division par z ro --> ZeroDivisionError
print(inverses(0)) # fonc. inexistante --> exception NameError
except NameError:
except NameError:
print("appel une fonction non d finie")
print("appel une fonction non d finie")
except ZeroDivisionError as exc:
print("erreur", exc)
except ZeroDivisionError as exc:
print("erreur", exc)
appel une fonction non d finie
erreur float division by zero
3. Les classes exception
" Python poss de de nombreuses classes dexceptions natives.
14
" Toute exception est une instance (un objet) cr partir dune classe exception.
Voici est le mod le d'hi rarchie des exceptions en Python:
La classe la plus lev e est BaseException
Les sous-classes directes
15
Quelques classes dexception de base (qui d rivent de BaseException) :
La classe Exception est la classe de base pour toutes les exceptions natives qui nentra nent pas
une sortie du syst me et pour toutes les exceptions d finies par lutilisateur
La classe ArithmeticError est la classe de base pour les exceptions natives qui sont lev es pour
diverses erreurs arithm tiques et notamment pour les classes OverflowError, ZeroDivisionError
et FloatingPointError ;
Exemple
def division(a, b):
try:
d = a//b
except ArithmeticError:
print("Erreur")
16
La classe BufferError est la classe de base pour les exceptions lev es lorsquune op ration li e un
tampon (buffer) ne peut pas tre ex cut e ;
La classe LookupError est la classe de base pour les exceptions qui sont lev es lorsquune cl ou
un index utilis sur un tableau de correspondances ou une s quence est invalide.
Exemple
T = [1, 2, 3]
try:
print(T[4])
Publicité
except LookupError:
print("Indice est sup rieur la taille du tableau")
La classe AttributeError est d clench e lorsqu'une r f rence d'attribut ou une attribution
choue, par exemple lorsqu'un attribut non existant est r f renc .
class Personne:
def __init__(self, nom):
self.nom = nom
try:
p = Personne(" ahmed")
print(p.prenom)
except AttributeError:
print("Erreur d'attribut")
4. D finir une exception
17
Il est possible de d finir un nouveau type d'exception pour un type d'erreur sp cifique. Pour cela, il faut cr er
une nouvelle classe d rivant de la classe BaseException ou d'une de ses sous-classes (Exception par
exemple).
Lexemple suivant cr e une exception AucunChiffre qui est lanc e par la fonction conversion lorsque la
cha ne de caract res quelle doit convertir ne contient pas que des chiffres.
class AucunChiffre(Exception):
"""
cha ne de caract res contenant aussi autre chose que des chiffres
"""
pass
def conversion(s):
if not s.isdigit():
raise AucunChiffre(s)
return int(s)
try:
s = "123a"
print(s, " = ", conversion(s))
except AucunChiffre as exc:
on affiche ici le commentaire associ la classe d'exception
et le message associ
print(AucunChiffre.__doc__, " : ", exc)
cha ne de caract res contenant aussi autre chose que des chiffres
: 123a
5. Les assertions
18
Syntaxe
Les assertions sont un moyen simple de sassurer, avant de continuer, quune condition est respect e.
Ce sont simplement des expressions bool ennes qui v rifie si les conditions renvoient true ou non. Si
lexpression est vraie, le programme ne fait rien et passe la ligne de code suivante. Cependant, si elle
est fausse, une exception AssertionError est lev e.
assert <condition>
assert <condition>,<error message>
num=int(input('Entrer un nombre: '))
assert num>=0
print('vous avez saisi: ', num)
L'instruction d'impression s'affichera si le nombre entr est
sup rieur ou gal 0. Les nombres n gatifs entra nent l'abandon du
programme apr s l'affichage de l'AssertionError.
Entrez un nombre: 100
Vous avez entr 100
Entrez un nombre: -10
Traceback (dernier appel le plus r cent):
Fichier "C: /python36/xyz.py", ligne 2, dans <module>
assert num> = 0
AssertionError
num=int(input(' Entrer un nombre : '))
assert num>=0, " Seuls les nombres positifs sont accept s."
print('vous avez saisi : ', num)
Entrez un nombre: -10
Traceback (dernier appel le plus r cent):
Fichier "C: /python36/xyz.py", ligne 2, dans <module>
assert num> = 0, "Seuls les nombres positifs sont accept s."
AssertionError: Seuls les nombres positifs sont accept s.