7  Lire et comprendre les erreurs Python

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.

7.1 Anatomie d’une traceback

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

resultat = 10 / 0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
Cell In[1], line 1
----> 1 resultat = 10 / 0

ZeroDivisionError: division by zero

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.
Règle d’or pour lire une traceback

Lisez de BAS en HAUT. Le message d’erreur à la dernière ligne est souvent le plus parlant. Les lignes du dessus remontent la chaîne d’appels (utile dans les programmes complexes).

7.2 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.

# 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éé.

print(mavariable)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[2], line 1
----> 1 print(mavariable)

NameError: name 'mavariable' is not defined

TypeError — Mauvais type

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

"abc" + 5
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[3], line 1
----> 1 "abc" + 5

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

ValueError — Valeur incorrecte

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

int("abc")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[4], line 1
----> 1 int("abc")

ValueError: invalid literal for int() with base 10: 'abc'

IndexError — Indice hors limites

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

ma_liste = [10, 20, 30]
print(ma_liste[10])
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Cell In[5], line 2
      1 ma_liste = [10, 20, 30]
----> 2 print(ma_liste[10])

IndexError: list index out of range

KeyError — Clé inexistante

Même idée avec un dictionnaire.

mon_dict = {"a": 1, "b": 2}
print(mon_dict["c"])
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[6], line 2
      1 mon_dict = {"a": 1, "b": 2}
----> 2 print(mon_dict["c"])

KeyError: 'c'

ZeroDivisionError — Division par zéro

5 / 0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
Cell In[7], line 1
----> 1 5 / 0

ZeroDivisionError: division by zero

IndentationError — Indentation incorrecte

Python est extrêmement strict sur l’indentation.

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

7.3 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.
Astuce de débogage : print() bien placés

Avant de se lancer dans un débogueur complexe, un simple print() bien placé permet souvent de comprendre :

def calculer_moyenne(notes):
    print("notes reçues :", notes)   # ← pour inspecter
    somme = sum(notes)
    print("somme :", somme)          # ← pour inspecter
    return somme / len(notes)

7.4 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 :

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
36

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.


✏️ Exercice 0.3 — 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.
x = 10
print(y)
ma_liste = [1, 2, 3]
print(ma_liste[5])
age = "25"
print(age + 10)
if x > 0
    print("positif")

Code ANameError: 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 BIndexError: 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 CTypeError: 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 DSyntaxError: expected ':'

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

🧩 Quiz 0.4 — Les erreurs Python

Question 1

Quel type d’erreur lève int("abc") ?

  1. TypeError
  2. ValueError
  3. NameError
  4. SyntaxError

b) ValueError — le type (str) est correct pour int(), mais la valeur "abc" ne peut pas être convertie en entier.

Question 2

Quel type d’erreur lève ma_liste[100] si ma_liste = [1, 2, 3] ?

  1. KeyError
  2. IndexError
  3. ValueError
  4. NameError

b) IndexError — on dépasse la taille de la liste. Pour un dictionnaire avec une clé inexistante, c’est KeyError.

Question 3

Dans quel ordre lire une traceback ?

  1. De haut en bas (premier message lu en premier)
  2. De bas en haut (le message important est à la fin)
  3. Aléatoirement
  4. Python trie par ordre d’importance

b) — la dernière ligne donne le type d’erreur et le message explicatif, c’est elle qu’il faut lire en premier.

Question 4

Quelle est la différence entre une erreur et un bug ?

  1. Aucune, ce sont des synonymes
  2. Une erreur arrête le programme ; un bug logique produit un résultat faux mais le programme tourne
  3. Une erreur est grave, un bug est mineur
  4. Un bug est dans le code, une erreur vient de l’utilisateur

b) — distinction cruciale : une erreur est visible (le programme plante), un bug logique est silencieux et bien plus difficile à détecter.