Les exceptions.

 

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.

Avec l'ajout de cette notion d'exception "raise" peut prendre maintenant cinq formes différentes.

 

- 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é.