Gérer les exceptions en Python avec try, except, else et finally

Python nous fournit des structures permettant de gérer manuellement certaines exceptions. Nous allons voir comment mettre en place ces structures dans cette leçon.

 

L’instruction try… except

Les clauses try et except fonctionnent ensemble. Elles permettent de tester (try) un code qui peut potentiellement poser problème et de définir les actions à prendre si une exception est effectivement rencontrée (except).

Imaginons par exemple un script qui demande à un utilisateur d’envoyer deux nombres grâce à la fonction input() qui permet de recevoir des données d’utilisateurs externes.

Le but de notre script va être de calculer le quotient de ces deux nombres entiers. Ici, on peut déjà anticiper des cas d’erreurs qui peuvent se présenter : l’utilisateur peut nous envoyer autre chose qu’un nombre entier ou peut nous envoyer un dénominateur égal à 0, ce qui est interdit en mathématique.

On va vouloir gérer ces deux cas exceptionnels. Pour cela, on va pouvoir utiliser deux blocs try et except comme cela :

Utilisation de blocs try except pour gérer les exceptions en Python

Ici, on place le code à tester à l’intérieur du bloc try. Si aucune erreur n’est détectée par Python lors de l’exécution du code, c’est-à-dire si aucun objet exception n’est créé, ce qui se situe dans la clause except va être ignoré.

En revanche, si une exception intervient pendant l’exécution du code dans try, le reste du code dans cette clause est ignoré et on rentre dans l’instruction except. Gérer les exceptions comme cela permet notamment d’éviter l’arrêt de l’exécution du script dans des cas où cela ne nous semble pas nécessaire.

Notre code ci-dessus est cependant loin d’être optimise car notre clause except est bien trop large. Lorsqu’on gère les exceptions manuellement, on voudra toujours apporter la gestion la plus fine possible pour éviter de capturer toutes les erreurs n’importe comment.

Pour cela, nous allons préciser le type d’erreur qu’une instruction except doit intercepter. Si on souhaite gérer plusieurs types d’exceptions, on pourra préciser autant d’instructions except qu’on le souhaite à la suite d’un try.

Regardez plutôt le code ci-dessous :

Utilisation de blocs try except pour gérer certaines exceptions en Python

Ce code est déjà beaucoup plus optimisé puisqu’il nous permet une gestion plus fine des erreurs et ne va en l’occurence capturer que deux types d’exceptions : le cas où les données entrées ne sont pas des entiers et le cas où le dénominateur est égal à 0.

Ce code demande cependant bien évidemment de connaitre les classes d’exception Python, mais il suffit de consulter la documentation en cas de doute.

Notez que rien ne nous empêche de préciser un except sans classe à la fin si on souhaite absolument donner des ordres dans le cas où Python capturerait tout autre type d’exceptions que ceux correspondant aux clauses except précédentes.

 

La clause else

Nous allons également pouvoir ajouter une clause else en fin d’instruction try… except. Le code contenu dans cette clause sera exécuté dans le cas où aucune exception n’a été levée par la clause try.

Il est considéré comme une bonne pratique de placer le code “non problématique” dans la clause else plutôt que dans la clause try.

On pourrait ainsi réécrire notre exemple précédent de la façon suivante :

Utilisation d'une clause else pour gérer des exceptions en Python

 

La clause finally

La dernière clause à connaitre est la clause fin ally. Le code qu’elle contient sera exécuté dans tous les cas, qu’une exception ait été levée par la clause try ou pas.

Cette clause va s’avérer très utile lorsqu’on voudra terminer certaines opérations (fermer un fichier par exemple) quel que soit l’état du script.

Utilisation d'une clause finally pour gérer des exceptions en Python

 

Définir nos propres classes d’exception

Pour finir, vous devez savoir que Python nous laisse la possibilité de créer nos propres classes d’exception.

Pour cela, nous allons toujours créer des classes à partir de la classe de base Exception.

Définition d'une classe d'exceptions personnalisée en Python

Définir nos propres exceptions va s’avérer être une fonctionnalité très utile notamment dans le cas où on souhaite distribuer un module Python et que certaines de nos fonctions peuvent déclencher des exceptions non prises en charge par les classes d’exception standard Python.

Laisser un commentaire