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.txtSi 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')