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 :
resultat = 10 / 0Dé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.
# 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)TypeError — Mauvais type
On fait une opération impossible entre deux types incompatibles.
"abc" + 5ValueError — Valeur incorrecte
Le type est bon, mais la valeur ne convient pas.
int("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])KeyError — Clé inexistante
Même idée avec un dictionnaire.
mon_dict = {"a": 1, "b": 2}
print(mon_dict["c"])ZeroDivisionError — Division par zéro
5 / 0IndentationError — Indentation incorrecte
Python est extrêmement strict sur l'indentation.
if True:
print("indentation manquante")
# IndentationError: expected an indented blockDémarche de résolution
Quand une erreur survient, procédez dans cet ordre :
- Lisez la DERNIÈRE ligne de la traceback (le type + le message).
- Repérez le numéro de ligne indiqué et allez-y.
- Interrogez-vous : quelle était la valeur attendue ? Quelle était la valeur réelle ?
- Testez en isolation : copiez la ligne dans un interpréteur interactif pour inspecter.
- 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 :
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 12Aucune 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
int("abc") ?
ma_liste[100] si ma_liste = [1, 2, 3] ?
Diagnostic d'erreurs
Pour chacun des 4 codes ci-dessous, identifiez :
- Le type d'erreur (SyntaxError, NameError, TypeError, etc.).
- La cause précise du problème.
- La correction à apporter.
Faites votre diagnostic d'abord, puis vérifiez-le avec le bouton « Exécuter » de chaque code.
x = 10
print(y)ma_liste = [1, 2, 3]
print(ma_liste[5])age = "25"
print(age + 10)if x > 0
print("positif")Solutions
Code A — NameError: name 'y' is not defined
- Cause : on essaie d'afficher une variable
yqui n'a jamais été définie. - Correction : définir
yavant, ou utiliserx.
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 :
ageest une chaîne"25", on ne peut pas additionner une chaîne et un entier. - Correction : convertir en entier :
int(age) + 10, qui renvoie35.
Code D — SyntaxError: expected ':'
- Cause : oubli du
:à la fin de la ligneif. - Correction :
if x > 0:(avec le deux-points).