0% ont trouvé ce document utile (0 vote)
3 vues10 pages

Gérer les exceptions en Python efficacement

PYTHON

Transféré par

VPN VPN
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
3 vues10 pages

Gérer les exceptions en Python efficacement

PYTHON

Transféré par

VPN VPN
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

SCFT el Khadra PCAP - Programming Essentials in Python TSIRA

Exceptions en Pytnon
Erreurs d’un programmeur
Soit le code suivante : x = float(input("Enter x: "))
Comme un utilisateur peut entrer une chaîne de caractères complètement arbitraire, rien ne
garantit que cette chaîne peut être convertie en une valeur flottante et si l’utilisateur va entrer
« Bonjour», vous allez obtenir le message d'erreur suivant :

ValueError: could not convert string to float: 'Bonjour'

Exception non gérée


Chaque fois que votre code tente de faire quelque chose de mal / stupide / irresponsable / fou /
inapplicable, Python fait deux choses :

 arrête votre programme ;


 il crée un type spécial de données, appelé exeption.

Ces deux activités sont appelées générer une exception.

Qu'est-ce qui se passe ensuite ?

 si rien ne se passe pour gérer l'exception levée, le programme sera arrêté de force et
vous verrez un message d'erreur envoyé à la console par Python;
 sinon, si l'exception est traitée et gérée correctement, le programme suspendu peut être
repris et son exécution peut continuer.

Python fournit des outils efficaces qui vous permettent d’examiner les exceptions, de les identifier
et de les gérer efficacement. Cela est possible car toutes les exceptions potentielles ont un nom
non ambigu, ce qui vous permet de les catégoriser et de réagir de manière appropriée. Exemples :

value = 1 ZeroDivisionError: division by zero


value /= 0 Cette erreur d'exception s'appelle ZeroDivisionError

list = [] IndexError: list index out of range


x = list[0] C'est l' IndexError .

Comment gérez les exceptions ? (try-except )


Le mot try est la clé de la solution.

L’exemple suivant présente l'approche Python préférée :


SCFT el Khadra PCAP - Programming Essentials in Python TSIRA

firstNumber = int(input("Enter the first number: "))


secondNumber = int(input("Enter the second number: "))

try:
print(firstNumber / secondNumber)
except:
print("This operation cannot be done.")

print("THE END.")

 Le mot - clé try commence un bloc de code qui peut ou non fonctionner correctement;
 Ensuite, Python essaie d’effectuer l’action risquée. Si cela échoue, une exception est déclenchée ;
 Le mot – clé except commence un morceau de code qui sera exécuté si quelque chose dans
le try bloc va mal et une exception est levée, le code situé après le mot-clé except devrait fournir
une réaction adéquate;
 le retour au niveau d'imbrication précédent met fin à la section try-except .

Si plusieurs exceptions se glissent dans une except: branche, vous pouvez avoir du mal à
comprendre ce qui s’est réellement passé. Par exemple :

try:
x = int(input("Enter a number: "))
y = 1 / x
except:
print("something went wrong...")

print("THE END.")

Le message : something went wrong... apparaître dans la console ne dit rien sur la raison,
alors qu'il y a deux causes possibles de l'exception:
 données non entières entrées par l’utilisateur ;
 une valeur entière égale à 0 assignée à la variable x

Pour résoudre le problème, utilisez la syntaxe de l'instruction try comme suite :


try:
x = int(input("Enter a number: "))
y = 1 / x
print(y)
except ZeroDivisionError:
print("You cannot divide by zero, sorry.")
except ValueError:
print("You must enter an integer value.")
except:
print(“something went wrong...")

print("THE END.")

Remarque: Si une except branche non nommée existe, elle doit être spécifiée comme la dernière.
SCFT el Khadra PCAP - Programming Essentials in Python TSIRA
Hiérarchie des exceptions
Python 3 définit 63 exceptions intégrées, qui forment toutes une hiérarchie en forme
d'arborescence
La figure ci-dessous montre une petite partie de l’arbre d’exception complet.

 l'ordre des branches est important !


 ne mettez pas d'exceptions plus générales avant des exceptions plus concrètes ;
Dans l’exemple ci-dessous branche ZeroDivisionError est complètement inaccessible.

try:
y = 1 / 0 La sortie du code est :
except ArithmeticError:
print("Arithmetic
problem!")
except ZeroDivisionError:
print("Zero Division!")
print("THE END.")

Regardez le code ci-dessous. Notre solution est là.

try:
x = int(input("Enter a number: "))
y = 1 / x
print(y)
except ZeroDivisionError:
print("You cannot divide by zero, sorry.")
except ValueError:
print("You must enter an integer value.")
except:
print("something went wrong...")

print("THE END.")
SCFT el Khadra PCAP - Programming Essentials in Python TSIRA

Lorsque le code est exécuté, il produit l'une des quatre variantes de sortie suivantes :

 si vous entrez une valeur entière valide autre que zéro (par exemple, 5 ), elle indique :
0.2 THE END.

 si vous entrez 0 , il est écrit :


You cannot divide by zero, sorry. THE END.

 si vous entrez une chaîne non entière, vous voyez :


You must enter an integer value. THE END.

 (localement sur votre ordinateur) si vous appuyez sur Ctrl-C pendant que le programme attend
l'entrée de l'utilisateur (ce qui provoque une exception nommée KeyboardInterrupt ), le
programme indique:
something went wrong...
THE END.

Gérer plusieurs exceptions


Si vous souhaitez gérer plusieurs exceptions de la même manière, vous pouvez utiliser la syntaxe
suivante :
try:
:
except (exc1, exc2):
:

Vous devez simplement mettre tous les noms des exceptions engagées dans une liste séparée par
des virgules et ne pas oublier les parenthèses.

Remarque :

Une exception déclenchée peut dépasser les limites des fonctions et des modules, et parcourir la
chaîne d'appels à la recherche d'une except clause correspondante capable de la gérer. Si aucune
clause de ce type n'existe, l'exception reste non gérée et Python résout le problème de manière standard
(en mettant fin à votre programme et en émettant un message de diagnostic).

L'instruction raise
Syntaxe : raise exc

Raise instruction déclenche l'exception spécifiée nommée exc comme si elle l'avait été de manière
normale (naturelle).
L'instruction vous permet de:
 simuler la levée d'exceptions réelles (par exemple, pour tester votre stratégie de traitement)
 gérer partiellement une exception et confier à une autre partie du code la tâche de terminer
le traitement (séparation des problèmes).
Regardez le code ci-dessous. Voici comment vous pouvez l'utiliser dans la pratique :
SCFT el Khadra PCAP - Programming Essentials in Python TSIRA

def badFun(n):
raise ZeroDivisionError
try:
badFun(0)
except ArithmeticError:
print("What happened? An error?")
print("THE END.")

L' raise instruction peut également être utilisée de la manière suivante (notez l'absence du nom de
l'exception):
raise

raise instruction ne peut être utilisé que dans la except branche ; l'utiliser dans tout autre
contexte provoque une erreur.

Prenons un petit exemple. Nous allons lever une exception de type ValueError, si l'utilisateur
saisit une année négative ou nulle.

annee = input() # L'utilisateur saisit l'année


try:
annee = int(annee) # On tente de convertir l'année
if annee<=0:
raise ValueError("l'année saisie est négative ou nulle")
except ValueError:
print("La valeur saisie est invalide (l'année est peut-être négative).")

Exemple ci-dessus est pour montrer la syntaxe dans un véritable contexte. Ici, on lève une exception
que l'on intercepte immédiatement ou presque, l'intérêt est donc limité. Bien entendu, la plupart du
temps ce n'est pas le cas.

Dans le code ci-dessous le ZeroDivisionError est relevé à deux reprises :

def badFun(n):  d'abord, à l'intérieur de la try partie du code


try: (ceci est causé par la division zéro réelle)
return n / 0
except:  deuxièmement, à l'intérieur de la except
print("I did it again!") branche par raise instruction.
raise
try:
badFun(0)
except ArithmeticError:
print("I see!")

print("THE END.")

En effet, le code génère l’affichage suivant :

I did it again!
I see!
THE END.
SCFT el Khadra PCAP - Programming Essentials in Python TSIRA
L'instruction assert
Syntaxe : assert expression

Comment ça marche ?
 Il évalue l'expression.
 si l'expression est évaluée True , l'exécution se poursuit normalement.
 Sinon, une exception AssertionError est levée.

Voyons assert instruction en action. Regardez le code ci-dessous :

import math

x = float(input("Enter a number: "))


assert x >= 0.0
x = [Link](x)
print(x)

Le programme fonctionne parfaitement si vous entrez une valeur numérique valide supérieure ou
égale à zéro. Sinon, il s’arrête et émet le message suivant :

Traceback (most recent call last):


File ".[Link]", line 4, in
assert x >= 0.0
AssertionError

Les assertions sont un moyen simple de s'assurer, avant de continuer, qu'une condition est respectée.
En général, on les utilise dans des blocs try … except

Les assertions ne remplacent pas les exceptions et ne valident pas les données - ce sont leurs
compléments.

Si les exceptions et la validation des données s'apparentent à une conduite prudente, l'assertion peut
jouer le rôle d'un airbag.

annee = input("Saisissez une année supérieure à 0 :")


try:
annee = int(annee) # Conversion de l'année
assert annee > 0

except ValueError:
print("Vous n'avez pas saisi un nombre.")

except AssertionError:
print("L'année saisie est inférieure ou égale à 0.")

Enfin, il faut savoir que le mécanisme d'assertion est une aide au développeur, et ne doit en aucun
cas faire partie du code fonctionnel d'un programme. En supprimant toutes les instructions assert, le
programme doit continuer à fonctionner normalement.
SCFT el Khadra PCAP - Programming Essentials in Python TSIRA
Exceptions intégrées (built-in exeptions)
Les exceptions sont aussi courantes et normales que tout autre aspect de la vie d'un programmeur.
Nous allons vous montrer une courte liste des exceptions les plus utiles. Pour chaque exception, nous
vous montrerons :

 son nom;
 son emplacement dans l'arborescence des exceptions ;
 une brève description;
 un extrait de code indiquant les circonstances dans lesquelles l'exception peut être levée.

ArithmeticError
Emplacement : BaseException ← Exception ← ArithmeticError

La description :
Une exception abstraite incluant toutes les exceptions causées par des opérations arithmétiques telles
que la division zéro ou le domaine non valide d'un argument

AssertionError
Emplacement : BaseException ← Exception ← AssertionError

La description :
Une exception en béton posée par l'instruction d'assertion lorsque son argument est évalué
à False, None, 0, ou une chaîne vide.
Code :
from math import tan, radians

angle = int(input('Enter integral angle in degrees: '))

# we must be sure that angle != 90 + k * 180


assert angle % 180 != 90

print(tan(radians(angle)))

BaseException
Emplacement : BaseException

La description :
Le plus général (abstrait) de toutes les exceptions Python - toutes les autres exceptions sont incluses
dans celle-ci ; on peut dire que les deux branches exept suivantes sont équivalentes except :
et except BaseException:

IndexError
Emplacement : BaseException ← Exception ← LookupError ← IndexError
SCFT el Khadra PCAP - Programming Essentials in Python TSIRA
La description :
Une exception concrète déclenchée lorsque vous essayez d'accéder à un élément d'une séquence
non existante (par exemple, un élément de liste)

Code:
# the code shows an extravagant way
# of leaving the loop
list = [1, 2, 3, 4, 5]
ix = 0
doit = True
while doit:
try:
print (list[ix])
ix += 1
except IndexError:
doit = False
print('Done')

KeyboardInterrupt
Emplacement : BaseException ← KeyboardInterrupt

La description :
Une exception concrète est déclenchée lorsque l'utilisateur utilise un raccourci clavier conçu pour
mettre fin à l'exécution d'un programme ( Ctrl-C dans la plupart des systèmes d'exploitation); si le
traitement de cette exception ne conduit pas à la fin du programme, le programme continue son
exécution. Remarque: cette exception n'est pas dérivée de la classe Exception .

Code:
# this code cannot be terminated
# by pressing Ctrl-C
from time import sleep
seconds = 0
while True:
try:
print(seconds)
seconds += 1
sleep(1)
except KeyboardInterrupt:
print("Don't do that!")

LookupError
Emplacement : BaseException ← Exception ← LookupError

La description :

une exception abstraite incluant toutes les exceptions causées par des erreurs résultant de références
non valides à différentes collections (listes, dictionnaires, n-uplets, etc.)
SCFT el Khadra PCAP - Programming Essentials in Python TSIRA
MemoryError
Emplacement : BaseException ← Exception ← MemoryError

La description :
une exception concrète est déclenchée lorsqu'une opération ne peut pas être terminée en raison d'un
manque de mémoire disponible

Code:
# this code causes the MemoryError exception
# warning: executing this code may be crucial
# for your OS
# don't run it in production environments!

string = 'x'
try:
while True:
string = string + string
print(len(string))
except MemoryError:
print('This is not funny!')

OverflowError
Emplacement: BaseException ← Exception ← ArithmeticError ← OverflowError

La description :
une exception concrète est déclenchée lorsqu'une opération produit un nombre trop grand pour être
stocké avec succès

Code:
# the code prints subsequent
# values of exp(k), k = 1, 2, 4, 8, 16, ...
from math import exp
ex = 1
try:
while True:
print(exp(ex))
ex *= 2
except OverflowError:
print('The number is too big.')

ImportError
Emplacement: BaseException ← Exception ← StandardError ← ImportError

La description : une exception concrète déclenchée lorsqu'une opération d'importation échoue


SCFT el Khadra PCAP - Programming Essentials in Python TSIRA

Code:
# one of this imports will fail - which one?
try:
import math
import time
import abracadabra
except:
print('One of your imports has failed.')

KeyError
Emplacement : BaseException ← Exception ← LookupError ← KeyError

La description :
une exception concrète déclenchée lorsque vous essayez d'accéder à un élément inexistant d'une
collection (par exemple, un élément de dictionnaire)

Code :
# how to abuse the dictionary
# and how to deal with it
dict = { 'a' : 'b', 'b' : 'c', 'c' : 'd' }
ch = 'a'
try:
while True:
ch = dict[ch]
print(ch)
except KeyError:
print('No such key:', ch)

Les exceptions sont en fait des objets. Cependant, nous ne pouvons rien vous dire à propos de cet
aspect tant que nous ne vous présentons pas les classes, objets, etc.

Vous aimerez peut-être aussi