Contactez-nous

Ne pas masquer les erreurs inutilement

Apprenez à gérer les exceptions en Python de manière responsable. Evitez de capturer et d'ignorer les erreurs sans les traiter, et découvrez quand il est approprié de laisser une exception se propager.

Le piège de la capture silencieuse : ignorer les exceptions

L'un des pièges les plus courants dans la gestion des exceptions est de capturer une exception et de l'ignorer *sans rien faire*.

Exemple (à éviter) :

try:
    # Code susceptible de lever une exception
    x = 10 / 0  # Division par zéro
except ZeroDivisionError:
    pass  # On capture l'exception, mais on ne fait rien

Dans cet exemple, la `ZeroDivisionError` est capturée, mais le programme continue comme si de rien n'était. L'erreur est *masquée*, et le programmeur n'a aucun moyen de savoir qu'un problème s'est produit.

Cela peut conduire à des comportements inattendus, à des résultats incorrects, et rendre le débogage extrêmement difficile. Si une erreur se produit, il est *essentiel* d'en être informé.

Il est encore pire d'utiliser un bloc `except` générique et de l'ignorer :

try:
 #...
except:
 pass #Masque TOUTES les erreurs!

Quand est-il acceptable d'ignorer une exception ?

Il existe *très peu* de situations où il est acceptable d'ignorer une exception. Cela ne doit être fait que si vous êtes *absolument certain* que l'erreur n'a pas d'importance et ne peut pas affecter le reste du programme.

Un exemple (rare) pourrait être la tentative de suppression d'un fichier temporaire dont l'existence n'est pas garantie :

import os

try:
    os.remove("fichier_temporaire.tmp")
except FileNotFoundError:
    pass  # On ignore l'erreur si le fichier n'existe pas

Dans ce cas, l'absence du fichier n'est pas une erreur critique, et il est acceptable d'ignorer l'exception `FileNotFoundError`.

Cependant, même dans ce cas, il pourrait être utile d'ajouter un commentaire pour expliquer pourquoi l'exception est ignorée.

Dans la grande majorité des cas, il est préférable de *faire quelque chose* lorsqu'une exception est capturée, même si c'est simplement afficher un message d'erreur ou enregistrer l'erreur dans un fichier de log.

Traiter l'erreur ou la propager : les bonnes pratiques

Lorsque vous capturez une exception, vous avez généralement deux options :

  • Traiter l'erreur : Prendre des mesures pour corriger le problème, ou pour fournir une solution alternative. Par exemple, vous pouvez afficher un message d'erreur à l'utilisateur, demander une nouvelle entrée, utiliser une valeur par défaut, réessayer l'opération, etc.
  • Propager l'erreur : Si vous ne pouvez pas gérer l'erreur à l'endroit où elle s'est produite, vous pouvez la *re-lever* (avec `raise`) pour qu'elle soit gérée par un niveau supérieur du programme (par une fonction appelante, ou par le programme principal).

Exemple (traitement de l'erreur) :

try:
    x = int(input("Entrez un nombre : "))
except ValueError:
    print("Erreur : Vous devez entrer un nombre entier.")
    x = 0  # Utilisation d'une valeur par défaut

Exemple (propagation de l'erreur) :

def diviser(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        print("Erreur dans la fonction diviser : division par zéro.")
        raise  # Re-lève l'exception

# ...

try:
    resultat = diviser(10, 0)
except ZeroDivisionError:
    print("Erreur capturée au niveau supérieur.")

Dans le deuxième exemple, la fonction `diviser` capture l'exception `ZeroDivisionError`, affiche un message, puis *re-lève* l'exception. L'exception est alors capturée par le bloc `try...except` qui appelle `diviser`.

La décision de traiter l'erreur ou de la propager dépend du contexte et de la logique de votre programme. En général, vous devez traiter l'erreur au niveau le plus bas où vous avez suffisamment d'informations pour la gérer de manière appropriée. Si vous ne pouvez pas la gérer, propagez-la.

Documenter les exceptions

Lorsque vous choisissez de capturer et de gérer, ou de propager une exception, il est crucial de bien le documenter.

  • Utilisez des commentaires pour expliquer *pourquoi* vous capturez une exception particulière et *comment* vous la gérez.
  • Si vous re-levez une exception, expliquez pourquoi vous ne pouvez pas la gérer à ce niveau.
  • Si vous créez vos propres types d'exceptions, documentez-les soigneusement (dans des docstrings) pour expliquer quand et pourquoi elles sont levées.

Une bonne documentation rendra votre code plus facile à comprendre, à maintenir et à déboguer.