Les exceptions font partie d'un mécanisme
de contrôle du déroulement du programme. Les messages d'erreurs
aperçus lors de l'exécution d'un programme viennent de la
table d'exceptions par défaut de l'interpréteur Python. En
effet, les exceptions non interceptées par une instruction "try"
atteignent le sommet du processus Python, et exécute la logique
par défaut des traitements d'exceptions.
Le traitement d'une exception permet de passer par dessus le traitement d'un bout de programme. La structure de gestion des exceptions est faite par blocs de code. Il y a deux façons principales de gérer les exceptions, l'une d'elle comprend les instructions "try", "except", et "else" :
try:
<instruction> exécute des actions.
except <nom>:
<instruction> si <nom> est déclenchée pendant le bloc try.
except <nom2>:
<instruction> si <nom2> est déclenchée pendant le bloc try.
...
else:
<instruction> si aucune
exception n'est déclenchée.
L'autre comprend les instructions "try", et "finally" :
try:
<instruction> exécute des actions.
finally:
<instruction> exécuté
de toute façon.
La clause "finally" ne peut pas être
utilisé dans la même instruction "try" que "except" et "else",
donc il vaut mieux se les représenter comme deux instructions différentes.
Description
des mots réservés :
try.
"try" indique que la suite du programme sera
surveillée par une gestion d'exception, quelle soit laissée
par défaut ou qu'une nouvelle gestion soit implémentée.
except.
"except" permet la gestion d'une ou plusieurs
exceptions. Le mot réservé "except" peut-être suivit
de plusieurs arguments :
except: prend toutes les exceptions quelles que soit leurs types.
except <nom>: prend en compte l'exception <nom>.
except (<nom1>, <nom2>): Intercepte n'importe laquelles des exceptions listées.
except <nom>, <valeur>: intercepte l'exception <nom> avec sa donnée <valeur>.
else.
"else" permet d'exécuter la suite
du programme au cas ou aucune exception ne serait survenue.
finally.
"finally" applique toujours le bloc, quoi
qu'il se passe.
L'instruction
raise.
Il est aussi possible en Python de lever
des exceptions, ceci se fait par le mot réservé "raise".
La forme générale reste simple : le mot raise suivi par le
nom de l'exception à déclencher, et si nécessaire
un argument à envoyer.
raise <nom> # déclenche une exception manuellement.
raise <nom>, <données> #
idem mais avec des données.
Que peut lever "raise" comme nom d'exception
? "raise" peut appeler une exception intégrée a Python (IndexError),
ou le nom d'un objet de type chaîne que vous avez défini dans
votre programme. Il peut aussi se référencer à une
classe à une instance.
Exceptions
sous forme de classe.
Python a récemment généralisé la notion d'exception. Elles peuvent maintenant être identifiées par des classes et des instances de classes.
- raise chaine # comme except avec le même objet chaîne
- raise chaine, donnee # avec un donnée
supplémentaire
- raise calsse, instance # except avec cette classe, ou classe parent
- raise instance # comme raise instance.__class__, instance
- raise # re-raise de l'exception courante
L'utilité est que, lorsque l'on gère
une grande quantité d'exceptions, il n'est pas nécessaire
de mettre de nom après "except", car le nom de l'exception levée
sera traité dans la classe. De plus il est possible de rajouter
des sous-classes afin de compléter un domaine d'exception et ceci
sans toucher au code existant dans la classe parente.
L'instruction
assert.
L'instruction "assert" permet de rajouter des contrôles pour le débogage d'un programme.
On peut dire que "assert" est essentiellement un raccourci syntaxique pour un "raise" compris dans la fonction __debug__. Il s'écrit de la forme :
assert <test>, <données> # la partie données n'est pas obligatoire.
# "assert" lève toujours l'exception AssertionError !
Et cela est équivalant à :
if __debug__ :
if not <test> :
raise AssertionError, <données>
Les assertions peuvent être enlevées
du byte code si l'option -O est appelée lors de la compilation.
Les assertions sont principalement utilisées pendant le développement.
Il est impératif d'éviter les effets de bord dans les assertions
car, lors de leurs suppressions, l'effet est aussi enlevé.