CPGE OUJDA SUP
Les
exceptions dans Python
Vous
avez sûrement déjà été confronté(e) à des erreurs diverses, provenant de
l'utilisateur, d'une bibliothèque, etc.Par exemple, vous souhaitez que
l'utilisateur entre un nombre et que votre programme affiche le triple de ce
nombre.
Si vous utilisez input() , mais que
l'utilisateur entre une chaîne de caractères (sans l'entourer de guillemets), le programme
plante lamentablement. 4 mots-clés vont servir à gérer les erreurs.
Les mots-clés try, except, else et
finally
try permet « d'essayer » un
bout de code. Si une erreur est rencontrée, on cesse d'interpréter le code et
on passe aux except , qui permettent d'agir en
fonction de l'erreur qui s'est produite. C'est pourquoi try doit toujours être
suivi d'au moins un except ou d'un finally .
Nous allons, pour comprendre leur fonctionnement, analyser le code suivant.
try:
fichier = open("foo.txt", "r")
print int("abc")
except IOError:
print "Erreur
lors de l'ouverture du fichier !"
except ValueError:
print "Erreur
lors de la conversion !"
Les deux premières lignes,
dans le try: , sont tout d'abord
interprétées. La première tente d'ouvrir un fichier appelé foo.txt. Si
ce fichier existe dans le répertoire du script, remplacez "foo.txt"
par autre chose, de sorte que le fichier que le script tente d'ouvrir n'existe
pas.
La seconde essaie d'afficher à l'écran la chaîne "abc" convertie en
nombre.
La troisième ligne, qui contient le mot-clé except , est exécutée en cas d'IOError . IOError est l'exception lancée
lorsqu'il s'avère impossible d'ouvrir un fichier (entre autres). Dans ce cas,
on affiche une erreur. La cinquième ligne agit comme la troisième, en cas de ValueError , qui est lancé quand on
passe un argument avec le bon type (ici, "abc" est bien une chaîne),
mais que la valeur n'est pas correcte ("abc" ne saurait être
transformée en nombre, vous en conviendrez).
Lorsque nous lançons ce code, comme foo.txt n'existe pas,
l'ouverture du fichier provoque une IOError. Si nous le créons ( foo.txt), alors la ligne print
int("abc") sera interprétée et lancera une ValueError . Si, enfin, nous
remplaçons "abc" par "22" (ou toute autre chaîne qui
peut être convertie en nombre), alors aucune exception ne sera lancée et seul
le bloc try: aura été exécuté.
Il ne faut pas utiliser except: tout seul, car
des exceptions comme celles lancées lorsque l'utilisateur tente de quitter
risquent d'être interceptées, et donc d'empêcher celui-ci d'y parvenir. Si vous
voulez intercepter toutes les exceptions possibles, utilisez Exception .
Enfin, le mot-clé finally permet d'exécuter du code
après l'ensemble try: except: , quoi qu'il arrive (qu'une exception ait été
lancée ou non, qu'un return ou un break soit rencontré, le blocfinally: sera interprété).
Les exceptions
se trouvent dans le module Exceptions
Deux types
d'exceptions
n Les erreurs
d'exécution dans un bloc try .. except
n Les avertissements
sont dérivés de la classe Exception de
base Warning. Dans ce type d'erreur, un message est envoyé à l'utilisateur sans arrêter
l'exécution du programme si l'exception
est utilisée avec la fonction warn et non pas raise
Autre exemple
while True:
... try:
... x = int(raw_input("Please enter a number: "))
... break
... except ValueError:
... print "Oops! That was no valid number. Try again..."
Exemple
d'utilisation incorrecte avec un dictionnaire
dico qui n'a pas
de clé 8
try:
x = dico[8]
except LookupError:
print(consultation
erreur")
except KeyError:
print("clé
invalide")
Exemple :
list_find()
n La fonction list_find()
retourne l'indice de l'élément
recherché sinon -1
def list_find(lst,
target):
try:
index =
lst.index(target)
except ValueError:
index = -1
return index
Exemple :La
fonction divide()
def divide(x,
y):
try:
result =
x / y
except
ZeroDivisionError:
print("erreur
: division par zéro!")
else:
print("le resultat est", result)
finally:
print("exécution terminée")
divide(4,3) 
divide(4,0) 
Exemple Affiner
les informations
while 1:
try:
x =
int(input("Entrer un entier: "))
break
except ValueError
as e:
print( "
Try again...", e) #
e.value
print("fin")
Sans erreur ![]()
Avec erreur 
Autre
exemple : raise
import sys
try:
try:
fichier
= open('data.txt')
chaine
= fichier.readline()
entier = int(chaine.strip())
except IOError as
e:
print(
"I/O error({0}): {1}".format(e.errno, e.strerror))
except
ValueError:
print( "Erreur conversion en
entier.")
except:
print( 'Erreur non répertoriée:',
sys.exc_info()[0])
raise
except:
print ('erreur remontée')
![]()
![]()