resultat = 10 / 0--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) Cell In[1], line 1 ----> 1 resultat = 10 / 0 ZeroDivisionError: division by zero
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.
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.ZeroDivisionError: division by zero.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).
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 ':'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
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
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'
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
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'
5 / 0--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) Cell In[7], line 1 ----> 1 5 / 0 ZeroDivisionError: division by zero
Python est extrêmement strict sur l’indentation.
if True:
print("indentation manquante")
# IndentationError: expected an indented blockQuand une erreur survient, procédez dans cet ordre :
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)Attention à cette nuance importante :
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 1236
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.
Pour chacun des 4 codes ci-dessous, identifiez :
x = 10
print(y)ma_liste = [1, 2, 3]
print(ma_liste[5])age = "25"
print(age + 10)if x > 0
print("positif")Code A — NameError: name 'y' is not defined
y qui n’a jamais été définie.y avant, ou utiliser x.Code B — IndexError: list index out of range
ma_liste[2] pour le dernier élément.Code C — TypeError: can only concatenate str (not "int") to str
age est une chaîne "25", on ne peut pas additionner une chaîne et un entier.int(age) + 10, qui renvoie 35.Code D — SyntaxError: expected ':'
: à la fin de la ligne if.if x > 0: (avec le deux-points).Quel type d’erreur lève int("abc") ?
TypeErrorValueErrorNameErrorSyntaxErrorb) ValueError — le type (str) est correct pour int(), mais la valeur "abc" ne peut pas être convertie en entier.
Quel type d’erreur lève ma_liste[100] si ma_liste = [1, 2, 3] ?
KeyErrorIndexErrorValueErrorNameErrorb) IndexError — on dépasse la taille de la liste. Pour un dictionnaire avec une clé inexistante, c’est KeyError.
Dans quel ordre lire une traceback ?
b) — la dernière ligne donne le type d’erreur et le message explicatif, c’est elle qu’il faut lire en premier.
Quelle est la différence entre une erreur et un bug ?
b) — distinction cruciale : une erreur est visible (le programme plante), un bug logique est silencieux et bien plus difficile à détecter.