
Le bloc except : capturer et traiter les exceptions
Apprenez à utiliser le bloc 'except' en Python pour capturer et traiter les exceptions levées dans un bloc 'try'. Gérez différents types d'erreurs, accédez aux informations de l'exception, et assurez un comportement robuste de votre programme.
Syntaxe du bloc except : capturer une exception spécifique
Le bloc `except` suit un bloc `try` et permet de capturer et de traiter les exceptions qui se produisent à l'intérieur du bloc `try`.
Syntaxe de base :
try:
# Code susceptible de lever une exception
# ...
except ExceptionType:
# Code pour gérer l'exception de type ExceptionType
# ...- `except ExceptionType:` : Indique le type d'exception que ce bloc `except` doit capturer. Seules les exceptions de ce type (ou de ses sous-classes) seront capturées par ce bloc.
- Le bloc de code indenté après `except ExceptionType:` est le gestionnaire d'exception. Il est exécuté si une exception du type spécifié est levée dans le bloc `try`.
Exemple :
try:
x = 10 / 0 # Lève une ZeroDivisionError
except ZeroDivisionError:
print("Division par zéro impossible.")Dans cet exemple, le bloc `except ZeroDivisionError` capture l'exception `ZeroDivisionError` levée par la division par zéro. Le message "Division par zéro impossible." est affiché.
Capturer plusieurs types d'exceptions
Vous pouvez avoir plusieurs blocs `except` pour gérer différents types d'exceptions :
try:
# Code susceptible de lever différentes exceptions
# ...
except TypeError:
# Gérer les TypeError
# ...
except ValueError:
# Gérer les ValueError
# ...
except IndexError:
# Gérer les IndexError
# ...Python examine les blocs `except` dans l'ordre où ils sont définis. Le premier bloc `except` dont le type d'exception correspond à l'exception levée est exécuté. Les autres blocs `except` sont ignorés.
Il est recommandé de placer les blocs `except` pour les exceptions les plus spécifiques *avant* les blocs `except` pour les exceptions plus générales (car les exceptions sont organisées en une hiérarchie de classes).
Exemple :
try:
x = int(input("Entrez un nombre : "))
resultat = 10 / x
print(resultat)
except ValueError:
print("Vous devez entrer un nombre.")
except ZeroDivisionError:
print('Division par zéro')Capturer l'objet exception : as variable
Vous pouvez accéder à l'objet exception lui-même (qui contient des informations sur l'erreur) en utilisant la syntaxe `as variable` dans le bloc `except`.
Syntaxe :
try:
# ...
except ExceptionType as variable:
# Code pour gérer l'exception
# Vous pouvez utiliser la variable 'variable' pour accéder à l'objet exception
# ...Exemple :
try:
x = int("abc")
except ValueError as e:
print("Erreur de conversion :", e) # Affiche le message d'erreur associé à l'exceptionDans cet exemple, `e` est une variable qui contient l'objet exception `ValueError`. Vous pouvez accéder à ses attributs (comme le message d'erreur) en utilisant `e`. Le message d'erreur est souvent le plus utile.
Il est courant d'utiliser `e` comme nom de variable pour l'objet exception, mais vous pouvez utiliser n'importe quel nom valide.
Le bloc except générique : capturer toutes les exceptions (déconseillé)
Vous pouvez utiliser un bloc `except` sans spécifier de type d'exception pour capturer *toutes* les exceptions :
try:
# ...
except:
# Code pour gérer n'importe quelle exception
# ...Cependant, cette pratique est **fortement déconseillée** dans la plupart des cas. Il est préférable de capturer uniquement les exceptions que vous savez gérer. Un bloc `except` générique peut masquer des erreurs inattendues et rendre le débogage plus difficile.
Si vous voulez vraiment capturer toutes les exceptions (par exemple, pour les logger avant de quitter le programme), il est préférable d'utiliser `except Exception:` (qui capture toutes les exceptions *non-système*) ou `except BaseException:` (qui capture *toutes* les exceptions, y compris les exceptions système comme `KeyboardInterrupt` et `SystemExit`).
Exemple (déconseillé, mais illustre le concept) :
try:
# Code potentiellement problématique...
x = 1 / 0
except:
print("Une erreur s'est produite.") # Trop vague !Exemple (un peu mieux, mais toujours pas idéal) :
try:
x = 1 / 0
except Exception as e:
print(f"Une erreur s'est produite : {e}")Idéalement, capturez les exceptions spécifiques que vous prévoyez et savez gérer.
Bonnes pratiques pour le bloc except
Voici quelques bonnes pratiques pour l'utilisation du bloc `except` :
- Soyez spécifique : Capturez uniquement les exceptions que vous savez gérer. Evitez les blocs `except` génériques.
- Gérez l'erreur de manière appropriée : Ne vous contentez pas de capturer l'exception et de l'ignorer. Faites quelque chose d'utile, comme :
- Afficher un message d'erreur clair et informatif à l'utilisateur.
- Enregistrer l'erreur dans un fichier de log.
- Réessayer l'opération (si c'est pertinent).
- Fournir une valeur par défaut.
- Nettoyer les ressources (par exemple, fermer un fichier).
- Propager l'exception (si vous ne pouvez pas la gérer à ce niveau).
- Ne masquez pas les erreurs : Si vous ne savez pas comment gérer une exception, il est souvent préférable de la laisser se propager plutôt que de la capturer et de l'ignorer.
- Utilisez des blocs `except` multiples si nécessaire : Pour gérer différents types d'exceptions de différentes manières.
- Accédez à l'objet exception si besoin : Pour obtenir des informations supplémentaires sur l'erreur.