Les gestion des erreurs en Python : Les exceptions

1 – Introduction

Pour qu’un programme soit complet, il doit tenir compte de tous les cas possibles, en particulier, quand il manipule des données saisies par l’utilisateur. En effet, un programme qui demande à un utilisateur de saisir un entier par exemple, doit vérifier que la saisie est bien un entier et non autre chose (chaîne de caractère ou flottant par exemple).

Un autre exemple, c’est quand un programme utilise des fonctions systèmes de manipulation de fichiers, de communication réseau, … etc. Il doit toujours vérifier que l’appel système a bien réussi et n’a pas généré d’erreur.

Le mécanisme utilisé pour la gestion des erreurs en Python est : Les « exceptions ».

2 – Gestion des erreurs

Dans un programme, quand on a une partie du code qui est suceptible de générer une erreur et donc de lever une exception, on place cette partie du code dans un bloc « try … except … ».

Voici la syntaxe dans le cas général :

try:
<code susceptible de générer une exception>
except:
<traitement de l'exception>
[
finally:
<code exécuté dans tous les cas>
]

Dans le code précédent, le bloc « try » commence à s’exécuter. Si tout se passe bien, le bloc « expect » sera ignoré et on passe directement au bloc « finally ».
Si jamais une erreur se produit, l’exécution du bloc « try » est stoppée. Une exception, dont le type dépend de la nature de l’erreur, est levée. Cette dernière va être traitée par le bloc « except » prévu à cet effet. Celui-ci. Enfin, le bloc « finally » s’exécute. Remarquez que le bloc « finally » s’exécute dans tous les cas.

Il arrive également où une même partie du code soit susceptible de générer plusieurs types d’exception dans ce cas, on a la possibilité de mettre un seul bloc « except », et donc on définie un traitement commun à toutes les exceptions comme montré dans le code précédent.

La deuxième solution serait de mettre plusieurs blocs « except », et donc de définir plusieurs traitements selon le type de l’exception :

try:
<code susceptible de générer des exceptions>
except <exception 1>:
<traitement exception 1>
except <exception 2>:
<traitement exception 2>
...
except <exception n>:
<traitement exception n>
[
finally:
<traitement final>
]

Python définie une multitude de classes qui pourraient être utilisées pour déclencher des exceptions. La liste exhaustive de la hiérarchie des exceptions se trouve ici.

3 – Créer de nouveaux types d’exceptions

Python offre la possibilité de créer de nouveaux types d’exception. Pour ce, il faut créer une classe qui hérite, de manière directe ou indirecte, de la classe « BaseException » (La classe « BaseEception » doit être une une classe ancêtre de la classe à définir).

L’exemple suivant montre la définition d’une classe « ErreurPersonnalisee » qui hérite de la classe « BaseException ». Elle définie deux attributs : « code » et « msg » :

class ErreurPersonnalisee (BaseException):
def __init__(self, msg, code):
super().__init__(msg)
self.msg = msg
self.code = code
def __str__(self):
return str(self.code) + " - " + str(self.msg) + "\n"

raise ErreurPersonnalisee("Informations sur l'erreur", 1)

L’affichage produit est :

Traceback (most recent call last):
    File "test.py", line 10, in <module>
       raise erreur("Informations sur l'erreur", 1)
__main__.erreur: 1 - Informations sur l'erreur

4 – Exemples

4.1 – Lecture d’un fichier json

Les erreurs qui peuvent se produisent quand on lit un fichier JSON sont :

  • Le fichier est inexistant (L’exception levée dans ce cas est : « FileNotFoundError »),
  • Le fichier existe mais le programme n’a pas de droit de lecture sur lui (l’exception est « PermissionError »),
  • Le contenu du fichier n’est pas au format JSON (« ValueError »).

Le code suivant détaille bien les différents cas :

import json

try:
fichier = open("fichier.json", "r")
contenu = json.load(fichier)
print(contenu)
fichier.close()
except FileNotFoundError:
print("Le fichier demandé n'existe pas")
except PermissionError:
print("Le fichier existe mais pas de droit de lecture")
except ValueError:
print("Le fichier n'est pas au format json"

4.2 – Saisie d’un nombre entier

Lorsqu’on demande à l’utilisateur de saisir un entier, les erreurs possibles qui peuvent se produire sont :

  • L’utilisateur saisie « <CTRL>+<D> » pour la fin de fichier (L’exception levée dans ce cas est « EOFError »).
  • L’utilisateur saisie une chaîne de caractères qui ne peut être convertie en entier (l’exception dans ce cas est « ValueError »).
while True:
try:
n = int(input("Donner un nombre"))
break
except EOFError:
print("L'utilisateur n'a rien saisi")
except ValueError:
print("La saisie n'a pas pu être convertie en entier")

5 – Déclencher une exception

On utilise le mot clé « raise » pour lever une exception dans un code donné :

raise <objet exception>

Il arrive aussi que, dans un bloc « except », on veuille remonter la même exception pour qu’elle soit traitée à un niveau supérieur (une des fonctions appelantes). Pour cela il suffit juste de d’utiliser le mot clé « raise » sans préciser l’exception.

try:
<code susceptible de générer des exceptions>
except:
<traitement partiel de l’exception>
raise
# l'exception est remontée au niveau supérieur pour qu'elle soit
# traitée.

6 – Conclusion

Dans cet article, on a vu le concept d’exception en python qui permet la gestion des erreurs. Python définie une multitude d’exception, chacune prévue pour une type d’erreur particulier.

Il est possible de capturer une exception avec le les bloc « try … except … finally … », dans le but de la traiter et éviter l’arrêt brusque de l’exécution du programme.

On a vu qu’il est possible de créer nos propres types d’exceptions adaptées à l’application à développer.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *