Prépa Python

Préambule — chapitre 7 sur 54

Lire et comprendre les erreurs Python

Traceback, types d'erreurs et démarche de résolution

30 min4 évaluations

Toutes les personnes qui codent, même expérimentées, font des erreurs. La différence entre un débutant frustré et un développeur efficace ? La capacité à lire et comprendre les messages d'erreur. Ce chapitre vous donne les clés.

Anatomie d'une traceback

Quand votre code plante, Python affiche un bloc appelé traceback (« trace d'erreur »). Exemple :

python
resultat = 10 / 0

Décryptage ligne par ligne :

  • Traceback (most recent call last): — Python annonce un problème.
  • La ligne suivante indique l'emplacement : fichier, numéro de ligne, bloc concerné.
  • Le code en cause est affiché, avec un indicateur visuel.
  • La dernière ligne donne le type d'erreur et un message explicatif : ZeroDivisionError: division by zero.

Les types d'erreurs les plus fréquents

SyntaxError — Erreur de syntaxe

Le code ne respecte pas la grammaire de Python. L'interpréteur ne peut même pas le lire.

python
# Oubli du : après if
if x > 0
    print("positif")
# SyntaxError: expected ':'

NameError — Variable non définie

On utilise un nom qui n'a jamais été créé.

python
print(mavariable)

TypeError — Mauvais type

On fait une opération impossible entre deux types incompatibles.

python
"abc" + 5

ValueError — Valeur incorrecte

Le type est bon, mais la valeur ne convient pas.

python
int("abc")

IndexError — Indice hors limites

On tente d'accéder à un élément d'une liste qui n'existe pas.

python
ma_liste = [10, 20, 30]
print(ma_liste[10])

KeyError — Clé inexistante

Même idée avec un dictionnaire.

python
mon_dict = {"a": 1, "b": 2}
print(mon_dict["c"])

ZeroDivisionError — Division par zéro

python
5 / 0

IndentationError — Indentation incorrecte

Python est extrêmement strict sur l'indentation.

python
if True:
print("indentation manquante")
# IndentationError: expected an indented block

Démarche de résolution

Quand une erreur survient, procédez dans cet ordre :

  1. Lisez la DERNIÈRE ligne de la traceback (le type + le message).
  2. Repérez le numéro de ligne indiqué et allez-y.
  3. Interrogez-vous : quelle était la valeur attendue ? Quelle était la valeur réelle ?
  4. Testez en isolation : copiez la ligne dans un interpréteur interactif pour inspecter.
  5. Cherchez si besoin : le message d'erreur tel quel, sur un moteur de recherche, donne souvent la solution.

Différence entre bug et erreur

Attention à cette nuance importante :

  • Une erreur (exception) : le programme s'arrête et affiche une traceback. Facile à détecter.
  • Un bug logique : le programme tourne mais produit un résultat incorrect. Beaucoup plus sournois.

Exemple de bug logique :

python
def moyenne(notes):
    # Bug : on oublie de diviser par le nombre d'éléments !
    return sum(notes)

print(moyenne([10, 12, 14]))   # affiche 36 au lieu de 12

Aucune erreur visible, mais le résultat est faux. Les tests unitaires (vus au niveau Expert) existent précisément pour détecter ce genre de bugs.


Exercices

quiz 00.07.q1réponse unique
Quel type d'erreur lève int("abc") ?
quiz 00.07.q2réponse unique
Quel type d'erreur lève ma_liste[100] si ma_liste = [1, 2, 3] ?
quiz 00.07.q3réponse unique
Dans quel ordre lire une traceback ?
quiz 00.07.q4réponse unique
Quelle est la différence entre une erreur et un bug ?

Diagnostic d'erreurs

Pour chacun des 4 codes ci-dessous, identifiez :

  1. Le type d'erreur (SyntaxError, NameError, TypeError, etc.).
  2. La cause précise du problème.
  3. La correction à apporter.

Faites votre diagnostic d'abord, puis vérifiez-le avec le bouton « Exécuter » de chaque code.

python
x = 10
print(y)
python
ma_liste = [1, 2, 3]
print(ma_liste[5])
python
age = "25"
print(age + 10)
python
if x > 0
    print("positif")
Solutions

Code A — NameError: name 'y' is not defined

  • Cause : on essaie d'afficher une variable y qui n'a jamais été définie.
  • Correction : définir y avant, ou utiliser x.

Code B — IndexError: list index out of range

  • Cause : la liste n'a que 3 éléments (indices 0, 1, 2), on demande l'indice 5.
  • Correction : utiliser un indice valide, par exemple ma_liste[2] pour le dernier élément.

Code C — TypeError: can only concatenate str (not "int") to str

  • Cause : age est une chaîne "25", on ne peut pas additionner une chaîne et un entier.
  • Correction : convertir en entier : int(age) + 10, qui renvoie 35.

Code D — SyntaxError: expected ':'

  • Cause : oubli du : à la fin de la ligne if.
  • Correction : if x > 0: (avec le deux-points).