Les exceptions et leurs gestion
Introduction
Quelles sont les erreurs possibles dans le code suivant ?
nombre = int(input("Entrez un nombre:"))
resultat = 10 / nombre
Si on entre :
Une chaine de caractères (autre que des nombres), alors nous aurons l’erreur suivante :

Si nous entrons le chiffre 0, alors nous aurons l’erreur suivante :

Pour éviter ces erreurs d’exécution, nous pouvons, dans certains cas, valider la valeur entrée à l’aide d’un if
avant l’instruction dans laquelle il risque d’y avoir une erreur, ou d’utiliser la syntaxe try … except
.
Les exceptions
Les erreurs détectées durant l'exécution sont appelées des exceptions. Dans les exemples d'erreurs précédents, les types d'exceptions sont ValueError
et ZeroDivisionError
(voir point rouge 4 dans les images précédentes).
Autres exemples :
TypeError

Signification du message d'erreur : On ne peut pas concaténer une chaîne de caractères (str) et un entier (int).
NameError

Signification du message d'erreur : la variable x n'est pas définie.
IndexError

Signification du message d'erreur : le numéro de l'indice déborde (l'élément à l'indice 6 n'existe pas dans la liste).
Pour tous les types d'exceptions, voir la documentation officielle de python suivante :
Documentation complète sur les exceptions :
Gestion des exceptions
Syntaxe try/except
try:
# Instruction(s) contenant potentiellement une exception.
except <Type de l'exception>:
# Instructions de gestion de l'exception.
Dans le bloc «
try
», on met le code que l’on veut gérer, donc susceptible de lever une exception.Dans le bloc «
except
», on met le code à exécuter en cas d’exception. Il est possible de gérer plusieurs exceptions pour la(les) même(s) instruction(s).
Exemple :
Gestion des exceptions du code suivant :
nombre = int(input("Entrez un nombre:"))
resultat = 10 / nombre
Gestion de l'exception
ZeroDivisionError
: Le code suivant permet de détecter et gérer une exception de typeZeroDivisionError
dans l’instructionresultat = 10 / nombre
.
nombre = int(input("Entrez un nombre:"))
try:
resultat = 10 / nombre
except ZeroDivisionError:
print("La valeur entrée ne doit pas être 0!")
Gestion de l'exception
ValueError
: Le code suivant permet de détecter et gérer une exception de typeValueError
dans l’instructionnombre = int(input("Entrez un nombre:"))
.
try:
nombre = int(input("Entrez un nombre:"))
except ValueError:
print("La valeur entrée n'est pas un nombre.")
resultat = 10 / nombre
Dans l'exemple précédent, si ça rentre dans le except ValueError
, la variable nombre
ne sera pas définie à la ligne 8 resultat = 10 / nombre
, il va y avoir un autre type d'exception.
Lorsqu'une ligne de code dépend directement de la précédente, une solution possible serait de gérer plusieurs exceptions dans le même bloc.
try:
nombre = int(input("Entrez un nombre:"))
resultat = 10 / nombre
except ValueError :
print("La valeur entrée doit être un nombre entier.")
except ZeroDivisionError:
print("On ne peut pas diviser par 0.")
Syntaxe try/except/else/finally
try:
nombre = int(input("Entrez un nombre:"))
resultat = 10 / nombre
except ValueError:
print("La valeur entrée n'est pas un nombre")
except ZeroDivisionError:
print("La valeur entrée ne doit pas être 0!")
except:
print("Une erreur est survenue")
else:
print(resultat)
finally:
print("Fin!")
Dans le bloc «
try
», on met le code que l’on veut gérer, donc susceptible de lever une exception.Dans le bloc «
except
», on met le code à exécuter en cas d’exception. Il est possible de gérer plusieurs exceptions pour la(les) même(s) instruction(s).Dans le bloc «
else
», on met le code à exécuter lorsqu’aucune exception ne survient.Dans le bloc «
finally
» est exécuté peu importe ce qui arrive (qu’il y ait une erreur ou non).
Exemple :
try:
nombre = int(input("Entrez un nombre:"))
resultat = 10 / nombre
except ValueError:
print("La valeur entrée n'est pas un nombre.")
except ZeroDivisionError:
print("La valeur entrée ne doit pas être 0!")
except:
print("Une erreur est survenue.")
else:
print(resultat)
finally:
print("Fin!")
Pratiques non conseillées
Gérer plusieurs types d'exceptions de la même façon :
try:
nombre = int(input("Entrez un nombre:"))
resultat = 10 / nombre
except (ValueError, ZeroDivisionError) :
print("Une erreur a eu lieu.")
Il n'est pas obligatoire de mentionner le type d'exception dansexcept
mais ceci est vivement déconseillé au risque de gérer à tort tous les types d'exceptions de la même façon.
try:
nombre = int(input("Entrez un nombre:"))
resultat = 10 / nombre
except :
print("Une erreur a eu lieu.")
Last updated