
Capturer plusieurs types d'exceptions
Apprenez à capturer plusieurs types d'exceptions en Python avec plusieurs blocs 'except', ou avec un seul bloc 'except' gérant plusieurs types. Gérez les erreurs de manière précise et granulaire.
Plusieurs blocs except : un gestionnaire par type d'exception
La manière la plus courante de capturer plusieurs types d'exceptions est d'utiliser plusieurs blocs `except`, un pour chaque type d'exception que vous voulez gérer spécifiquement.
Syntaxe :
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
# ...
# ... Autres blocs except ...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 important de placer les blocs `except` pour les exceptions les plus *spécifiques* avant les blocs `except` pour les exceptions plus *générales*. Par exemple, placez `except ValueError:` avant `except Exception:` car `ValueError` est une sous-classe de `Exception`.
Exemple :
try:
x = int(input("Entrez un nombre : "))
resultat = 10 / x
print(resultat)
liste = [1, 2, 3]
print(liste[x]) # Potentielle IndexError
except ValueError:
print("Vous devez entrer un nombre entier.")
except ZeroDivisionError:
print("Division par zéro impossible.")
except IndexError:
print("Indice hors limites.")Dans cet exemple, il y a trois blocs `except` : un pour `ValueError`, un pour `ZeroDivisionError`, et un pour `IndexError`. Si l'utilisateur entre une chaîne non convertible en entier, le bloc `except ValueError` sera exécuté. Si l'utilisateur entre 0, le bloc `except ZeroDivisionError` sera exécuté. Si l'utilisateur entre un nombre trop grand, le bloc `except IndexError` sera exécuté.
Un seul bloc except pour plusieurs types : utiliser un tuple
Si vous voulez exécuter le *même* code pour plusieurs types d'exceptions, vous pouvez utiliser un seul bloc `except` avec un tuple de types d'exceptions.
Syntaxe :
try:
# ...
except (TypeError, ValueError):
# Code pour gérer les TypeError et les ValueError
# ...Exemple :
try:
x = int(input("Entrez un nombre : "))
y = 10 / x
except (ValueError, ZeroDivisionError) as e:
print("Erreur :", e)Dans cet exemple, le même message d'erreur sera affiché si l'utilisateur entre une chaîne non convertible en entier (`ValueError`) ou s'il entre 0 (`ZeroDivisionError`).
Vous pouvez combiner cette approche avec la capture de l'objet exception (`as e`) pour accéder aux informations de l'exception.
Ordre des blocs except : du plus spécifique au plus général
Lorsque vous utilisez plusieurs blocs `except`, l'ordre est important.
Python examine les blocs `except` dans l'ordre où ils sont définis, et exécute le premier bloc qui correspond au type de l'exception levée.
Si vous placez un bloc `except` pour une exception générale (comme `Exception`) avant un bloc `except` pour une exception plus spécifique (comme `ValueError`), le bloc pour l'exception spécifique ne sera *jamais* exécuté.
Exemple (avec un ordre incorrect) :
try:
x = int("abc")
except Exception:
print("Une erreur s'est produite.") # Ce bloc sera toujours exécuté en premier
except ValueError:
print("Erreur de valeur.") # Ce bloc ne sera jamais exécutéDans cet exemple, le bloc `except ValueError` ne sera jamais exécuté, car le bloc `except Exception` (qui capture toutes les exceptions) est placé avant.
Pour corriger cela, inversez l'ordre des blocs `except` :
try:
x = int("abc")
except ValueError:
print("Erreur de valeur.")
except Exception:
print("Une erreur s'est produite.")En général, placez les blocs `except` pour les exceptions les plus spécifiques *avant* les blocs `except` pour les exceptions plus générales.
Bonnes pratiques et recommandations
Voici quelques bonnes pratiques pour capturer plusieurs types d'exceptions :
- Soyez aussi spécifique que possible : Capturez les exceptions spécifiques que vous savez gérer, plutôt que d'utiliser des blocs `except` trop généraux.
- Utilisez plusieurs blocs `except` si vous avez besoin de gérer différents types d'exceptions de différentes manières.
- Utilisez un seul bloc `except` avec un tuple si vous voulez exécuter le même code pour plusieurs types d'exceptions.
- Respectez l'ordre des blocs `except` : Du plus spécifique au plus général.
- Documentez votre code : Expliquez pourquoi vous capturez certaines exceptions et comment vous les gérez.
- N'oubliez pas que vous pouvez toujours utiliser `as e` pour accéder à l'objet exception et obtenir plus d'informations sur l'erreur.