Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

Les erreurs sont inévitables dans tout programme, et Python offre plusieurs façons de les gérer.
La gestion des erreurs est cruciale pour garantir que votre programme puisse continuer à fonctionner de manière sûre et efficace, même lorsque quelque chose d’inattendu se produit.

Dans cette leçon, nous allons explorer les différents types d’erreurs, comment les gérer, comment en déclencher vous-même, et comment s’assurer que les tâches importantes de nettoyage sont toujours exécutées.


Types d’erreurs en Python

Avant d'apprendre à gérer les erreurs, nous devons comprendre les deux principales catégories :

  • Erreurs de syntaxe : Elles se produisent lorsque le code Python n’est pas syntaxiquement correct. Elles sont détectées par l’interpréteur Python avant l’exécution du programme.
    Exemple : oublier un deux-points après une instruction if.

  • Exceptions : Elles surviennent pendant l’exécution du programme lorsqu’un événement inattendu arrive — par exemple, diviser un nombre par zéro ou tenter d’accéder à un index invalide dans une liste.

Gérer les exceptions avec try et except

La méthode la plus courante pour gérer les exceptions en Python est d’utiliser des blocs try/except :

  • Le bloc try contient le code qui pourrait provoquer une exception.
  • Le bloc except contient le code à exécuter si une exception est levée.

Exemple :

try:
    file = open("file.txt", "r")
    content = file.read()
    print(content)
except IOError:
    print("Le fichier n’a pas pu être ouvert.")

Ici :

  • Si le fichier "file.txt" n’existe pas ou ne peut pas être ouvert, Python lève une exception IOError.
  • Le bloc except la capture et affiche un message compréhensible au lieu de planter.
CONSEIL : Gardez le bloc try aussi petit que possible — incluez uniquement le code susceptible d’échouer, pas la logique sans rapport.

Gérer plusieurs types d’exceptions

Vous pouvez gérer différents types d’exceptions séparément en utilisant plusieurs blocs except :

try:
    # code qui peut lever des exceptions
except TypeError:
    # gérer les erreurs de type
except ValueError:
    # gérer les erreurs de valeur
except:
    # gérer toutes les autres exceptions

Le dernier except nu attrape toutes les exceptions non gérées — mais utilisez-le avec précaution, car il peut masquer des bugs inattendus.

Lever vos propres exceptions

Parfois, votre programme doit signaler qu’une erreur s’est produite — même si Python ne la considérerait pas normalement comme une erreur. Vous pouvez lever des exceptions avec l’instruction raise.

Exemple :

def divide(a, b):
    if b == 0:
        raise ValueError("Le deuxième argument ne peut pas être zéro")
    return a / b

print(divide(10, 2))  # 5.0
print(divide(10, 0))  # ValueError: Le deuxième argument ne peut pas être zéro

Cela vous permet de définir des messages d’erreur clairs et d’arrêter l’exécution lorsque des données invalides sont rencontrées.

Le bloc finally

Le bloc finally définit un code qui s’exécute toujours — qu’une exception se soit produite ou non. Il est souvent utilisé pour libérer des ressources comme des fichiers ou des connexions à une base de données.

Exemple :

try:
    file = open("file.txt", "r")
    content = file.read()
    print(content)
finally:
    file.close()

Même si la lecture du fichier a causé une erreur, le bloc finally garantit que le fichier est fermé.

IMPORTANT : Toujours fermer les fichiers et libérer les ressources dans un bloc finally (ou utiliser l’instruction "with") pour éviter les fuites.


Voici une section additionnelle que vous pouvez ajouter à la leçon Gestion des erreurs, expliquant pourquoi "try/except pour tout" est une mauvaise pratique et quand il vaut mieux cibler la gestion des exceptions.


Évitez de capturer toutes les exceptions sans raison

Une erreur fréquente chez les débutants est d’entourer de larges blocs de code avec un seul bloc try/except qui capture tout — ou pire, d’utiliser un simple except: sans spécifier le type d’erreur.

Exemple de mauvaise pratique :

try:
    # beaucoup de code sans lien ici
except:
    pass  # ignore silencieusement toutes les erreurs

Pourquoi c’est dangereux :

  • Cache les bugs : Les erreurs réelles dans votre code seront ignorées, rendant leur détection plus difficile.
  • Masque la cause : Vous perdez des informations sur ce qui a réellement échoué.
  • Peut entraîner un comportement inattendu : Le programme continue à tourner dans un état invalide.

Quand utiliser une gestion large des exceptions

Attraper toutes les exceptions (except Exception:) doit être rare et intentionnel. Exemples où cela peut être approprié :

  • Journalisation d’erreurs au plus haut niveau dans un programme, pour éviter un plantage et écrire l’erreur dans un fichier de log.
  • Boucles de secours dans des services qui doivent rester opérationnels (tout en enregistrant / rapportant l’erreur avant de continuer).
  • Débogage temporaire pour voir rapidement si quelque chose ne va pas — mais uniquement comme outil à court terme.

Bonnes pratiques

  • Soyez précis : Capturez uniquement les exceptions que vous attendez et savez gérer.
  • Gardez les blocs try petits : Entourez uniquement le code susceptible d’échouer, pas des fonctions entières.
  • Toujours journaliser ou gérer l’exception de manière significative — ne vous contentez pas de “passer” dessus.

En étant sélectif, vous rendez votre code plus facile à déboguer, plus sûr à exécuter et beaucoup plus prévisible.


Conclusion

La gestion des erreurs est une partie fondamentale de la programmation en Python :

  • Elle empêche les plantages inattendus.
  • Elle vous permet de gérer les problèmes avec élégance.
  • Elle rend votre code plus robuste, fiable et sûr.

En maîtrisant les exceptions, en levant des erreurs personnalisées et en utilisant finally, vous écrirez des programmes mieux préparés pour le monde réel.