Contactez-nous

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.