Gestion des exceptions en Python à l’aide de l’instruction try, except et finally
Exceptions en Python
Python possède de nombreuses exceptions intégrées qui sont levées lorsque votre programme rencontre une erreur (quelque chose dans le programme ne va pas).
Lorsque ces exceptions se produisent, l’interprète Python arrête le processus en cours et le transmet au processus appelant jusqu’à ce qu’il soit géré. Si elle n’est pas gérée, le programme se plante.
Par exemple, considérons un programme où nous avons une fonction A
qui appelle la fonction B
, qui à son tour appelle la fonction C
. Si une exception se produit dans la fonction C
mais qu’elle n’est pas traitée dans C
, l’exception passe à B
puis à A
.
Si elle n’est jamais traitée, un message d’erreur s’affiche et notre programme s’arrête brutalement.
La capture des exceptions en Python
En Python, les exceptions peuvent être gérées à l’aide d’une déclaration try
.
L’opération critique qui peut lever une exception est placée à l’intérieur de la clause try
. Le code qui gère les exceptions est écrit dans la clause except
.
Nous pouvons donc choisir les opérations à effectuer une fois que nous avons attrapé l’exception. Voici un exemple simple.
Sortie
Dans ce programme, nous parcourons en boucle les valeurs de la liste randomList. Comme mentionné précédemment, la partie qui peut provoquer une exception est placée à l’intérieur du bloc try
.
Si aucune exception ne se produit, le bloc except
est sauté et le flux normal continue(pour la dernière valeur). Mais si une exception se produit, elle est attrapée par le bloc except
(première et deuxième valeurs).
Ici, nous imprimons le nom de l’exception en utilisant la fonction exc_info()
à l’intérieur du module sys
. Nous pouvons voir que a
provoque ValueError
et 0
provoque ZeroDivisionError
.
Puisque chaque exception en Python hérite de la classe de base Exception
, nous pouvons également effectuer la tâche ci-dessus de la manière suivante :
Ce programme a le même résultat que le programme ci-dessus.
Rattraper des exceptions spécifiques en Python
Dans l’exemple ci-dessus, nous n’avons pas mentionné d’exception spécifique dans la clause except
.
Ce n’est pas une bonne pratique de programmation, car cela permettra de rattraper toutes les exceptions et de traiter chaque cas de la même manière. Nous pouvons spécifier quelles exceptions une except
clause doit attraper.
Une try
clause peut avoir un nombre quelconque de except
clauses pour traiter différentes exceptions, cependant, une seule sera exécutée en cas d’exception.
Nous pouvons utiliser un tuple de valeurs pour spécifier plusieurs exceptions dans une clause except. Voici un exemple de pseudo-code.
try: # do something passexcept ValueError: # handle ValueError exception passexcept (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError passexcept: # handle all other exceptions pass
Lève des exceptions en Python
Dans la programmation Python, les exceptions sont levées lorsque des erreurs se produisent à l’exécution. Nous pouvons également lever manuellement des exceptions en utilisant le mot-clé raise
.
Nous pouvons éventuellement passer des valeurs à l’exception pour clarifier pourquoi cette exception a été levée.
Python try with else clause
Dans certaines situations, vous pourriez vouloir exécuter un certain bloc de code si le bloc de code à l’intérieur de try
s’est exécuté sans aucune erreur. Pour ces cas, vous pouvez utiliser le mot clé facultatif else
avec l’instruction try
.
Note : les exceptions dans la clause else ne sont pas traitées par les clauses except précédentes.
Voyons un exemple :
Sortie
Si on passe un nombre impair :
Enter a number: 1Not an even number!
Si on passe un nombre pair, la réciproque est calculée et affichée.
Enter a number: 40.25
Cependant, si nous passons 0, nous obtenons ZeroDivisionError
car le bloc de code à l’intérieur de else
n’est pas traité par la except
précédente.
Python try…finally
L’instruction try
en Python peut avoir une clause optionnelle finally
. Cette clause est exécutée quoi qu’il arrive et est généralement utilisée pour libérer des ressources externes.
Par exemple, nous pouvons être connectés à un centre de données distant via le réseau ou travailler avec un fichier ou une interface graphique utilisateur (GUI).
Dans toutes ces circonstances, nous devons nettoyer la ressource avant que le programme ne s’arrête, qu’il se soit exécuté avec succès ou non. Ces actions (fermeture d’un fichier, d’une interface graphique ou déconnexion du réseau) sont effectuées dans la clause finally
pour garantir l’exécution.
Voici un exemple d’opérations sur un fichier pour illustrer cela.
try: f = open("test.txt",encoding = 'utf-8') # perform file operationsfinally: f.close()
Ce type de construction permet de s’assurer que le fichier est fermé même si une exception se produit pendant l’exécution du programme.