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