Les exceptions

”Gestion des erreurs dans les scripts”

 

Lorsqu’une instruction d’un script ne se déroule pas correctement (par exemple, une division par zéro), une exception est levée ce qui interrompt le contexte d’exécution, pour revenir à un environnement d’exécution supérieur, jusqu’à celui gérant cette exception.

Par défaut, l’environnement supérieur est le shell de commande depuis lequel l’interpréteur Python a été lancé, et le comportement de gestion par défaut est d’afficher l’exception :

 

Pour gérer l’exception, et éviter la fin du programme, il faut utiliser la structure try et except :

try:

          # bloc d’instructions susceptibles d’échouer

except:

          # bloc d’instructions à faire en cas d’échec

Toutes les exceptions levées par Python sont des instances de sous-classe de la classe Exception.

La hiérarchie des sous-classes offre plusieurs exceptions standard, comme ValueError (exception levée quand on tente par exemple de convertir en nombre une chaine de caractères ne représentant pas un nombre) ou ZeroDivisionError (quand on tente de diviser un nombre par zéro).

Il est possible de compléter la structure try except avec un bloc else et un bloc finally. Les instructions du bloc else ne sont exécutées qu’en l’absence d’erreur et les instructions du bloc finally sont toujours effectuées quel que soient les erreurs rencontrées lors de l’exécution du bloc try ou en l’absence d’erreur.

 La syntaxe complète d’une exception est alors :

try:

           … # séquence normale d’exécution

except exception_1:

            … # traitement de l’exception 1

except exception_2:

           … # traitement de l’exception 2

else:

           … # bloc d’instructions exécutées en l’absence d’erreur

finally:

           … # bloc d’instructions toujours exécutées


Exemple
 :

Ce programme demande à l’utilisateur de saisir un nombre et tente de le convertir en flottant et de faire une division avec ce nombre :

Résultats dans la fenêtre Python Shell :

 

L’instruction raise permet de lever volontairement une exception. Ainsi le script du programme précédent devient :

Après la conversion de la chaine saisie au clavier en nombre, un test est effectué sur le nombre, si celui-ci est égale à 0, l’exception ValueError est levée à l’aide de l’instruction raise. Et bien-sûr si la chaine ne peut pas être convertie l’exception ValueError est également levée (c’est aussi le bloc d’exception du bloc try) :

 

Il est également possible de lever une exception avec l’instruction assert. Cette instruction va tester la condition mise juste après, et si elle est fausse, va lever une exception de type AssertionError, ce qui donne pour notre exemple :

Résultats dans la fenêtre Python Shell :

 

La structure Try … Except est donc très utile pour tout ce qui est vérification des saisies au clavier. Mais contrairement aux scripts précédents, il est préférable que le programme ne s’arrête pas si la saisie au clavier ne satisfait pas au programme.

On utilisera pour cela une boucle while, afin de redemander à l’utilisateur une saisie au clavier si la précédente n’est pas adéquate, comme dans l’exemple suivant :

Dans ce programme, on demande à l’utilisateur de saisir un nombre supérieur à 0 et on vérifie si c’est un nombre premier.

Résultats dans la fenêtre Python shell :

Remarque :

L’instruction break du bloc try permet, en l’absence d’erreur, de sortir de la boucle while et de finir le programme.