UVT MASTER BADS

Programming · course

Browse all programmation documents

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

Advertisement

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 .

Advertisement

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():

Advertisement

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])

Advertisement

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.