edubun
Français

Lire les messages d'erreur et un petit projet

Une trace d’erreur Python se lit par le bas : la dernière ligne nomme l’erreur, et l’indication au-dessus du code donne le fichier et le numéro de ligne.

Un papillon de nuit collé dans un cahier de bord en 1947

ContexteEn 1947, des ingénieurs travaillant sur l'ordinateur Mark II de l'Université Harvard ont trouvé un papillon de nuit coincé dans l'un de ses composants. Ils ont collé l'insecte dans leur cahier de bord et écrit à côté « first actual case of bug being found ». La page se trouve aujourd'hui au National Museum of American History du Smithsonian. La description du musée lui-même est prudente sur deux détails populaires. Les ingénieurs appelaient « bugs » les petites pannes bien avant, et Thomas Edison employait le mot dans les années 1870 : le papillon n'a donc pas inventé le terme ; la plaisanterie marche parce que le mot existait déjà. Et Grace Hopper, qui faisait partie de l'équipe du Mark II cette année-là, n'a probablement pas tenu ce cahier, même si elle et l'équipe ont contribué à faire de « bug » et « debug » des mots courants chez les programmeurs.

Aujourd'hui, la plupart des bugs sont des erreurs dans le code, et Python sait bien te parler de celles qu'il peut détecter. Les débutants voient souvent une erreur rouge comme un verdict. C'est plus proche d'un bon de livraison : ce qui s'est mal passé, à quelle ligne et dans quel morceau de code. Le secret est de savoir où regarder.

Lire une trace d'erreur de bas en haut

total = 0
count = 0
print(total / count)
Sortie
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(total / count)
          ~~~~~~^~~~~~~
ZeroDivisionError: division by zero
À lire dans l'ordre 1, 2, 3 : le type d'erreur et le message sur la dernière ligne, puis le fichier et le numéro de ligne, puis la partie marquée du code.

Commence par la dernière ligne. ZeroDivisionError: division by zero donne le type d'erreur et une courte explication. Remonte ensuite à la ligne File : le nom du fichier (le chemin complet du dossier y apparaît sur ton ordinateur ; il est raccourci en main.py ici) et le numéro de ligne, 3. La ligne dessous est le code lui-même, et Python 3.12 marque l'opération exacte qui a échoué avec ^ sous le signe /. Ne commence à changer des choses qu'après avoir lu les trois. Quand l'erreur survient dans une fonction, la trace liste chaque appel sur le chemin, et la ligne File la plus basse est en général celle à regarder en premier.

ErreurCause habituelleExemple
SyntaxErrorLa ligne n'est pas du Python valide : parenthèse, deux-points ou guillemet manquantprint("hi"
IndentationErrorIndentation manquante ou irrégulièreif x > 1 : sans ligne indentée
NameErrorUn nom qui n'existe pas encore, souvent une faute de frappepritn("hi")
TypeErrorUne opération sur le mauvais type"Age: " + 15
ValueErrorBon type, valeur impossibleint("abc")
IndexErrorIndice au-delà de la fin d'une liste ou d'une chaîne[1, 2][2]
KeyErrorClé absente du dictionnaire{"a": 1}["b"]
ZeroDivisionErrorDivision par zéro5 / 0

Une SyntaxError est différente des autres. Python la trouve avant d'exécuter quoi que ce soit : même la ligne 1 ne s'exécute pas, et il n'y a pas d'en-tête « Traceback ». Toutes les autres surviennent pendant l'exécution du programme, après que les lignes précédentes ont déjà fait leur travail. Quand tu attends une erreur précise, tu peux l'attraper avec try et except, que le tutoriel traite dans son chapitre sur les erreurs : Python essaie le bloc indenté, et si cette erreur survient, il exécute le bloc except au lieu de s'arrêter.

print("before")
n = int("abc")
print("after")
Sortie
before
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    n = int("abc")
        ^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'abc'
text = "abc"
try:
    n = int(text)
except ValueError:
    n = 0
print(n)
Sortie
0

Les bugs les plus difficiles ne donnent aucun message. En présence d’une erreur de logique, un programme s’exécute mais affiche la mauvaise réponse, comme le programme de notation de l'unité sur if qui donnait un C à 85. Python ne peut pas savoir ce que tu voulais dire. Pour ceux-là, retourne au tableau de suivi, ou ajoute des lignes print temporaires qui montrent les variables à chaque étape, puis retire-les une fois le bug trouvé.

Petit projet : un carnet d'argent de poche

Le projet utilise un élément de presque chaque unité : un dictionnaire de dépenses, une fonction qui renvoie un total, une boucle for, une f-string et un if. Tape-le, exécute-le, puis fais-le tien : change les articles, ajoute une catégorie, ou affiche un avertissement quand un seul article coûte plus de la moitié de l'argent de poche.

def total(spent):
    t = 0
    for amount in spent.values():
        t += amount
    return t

allowance = 30000
spent = {"snacks": 4500, "bus card": 10000, "notebook": 2500}
used = total(spent)
left = allowance - used
for item, amount in spent.items():
    print(f"{item}: {amount} won")
print(f"Spent {used}, left {left}")
if left < 15000:
    print("Less than half left")
Sortie
snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Spent 17000, left 13000
Less than half left

Avant de le modifier, écris un tableau de suivi pour used et left, et prédis ce qui se passe si tu ajoutes un article à 6000 wons. Provoque ensuite volontairement des erreurs : supprime les deux-points après la ligne def, écris spent de travers une fois, et divise used par zéro. Lis chaque trace de bas en haut avant de corriger. Savoir casser un programme puis le réparer est la vraie compétence que ce cours a construite.

trace d'erreur (traceback)Le rapport d'erreur de Python ; à lire de bas en haut
SyntaxErrorDu code invalide, trouvé avant que quoi que ce soit s'exécute
NameErrorUn nom qui n'existe pas, souvent une faute de frappe
TypeErrorUne opération sur le mauvais type de valeur
ValueErrorLe bon type avec une valeur impossible, comme int("abc")
erreur de logiqueS'exécute sans message mais donne la mauvaise réponse
try / exceptExécute le bloc except au lieu de s'arrêter quand cette erreur survient
  1. Quelle ligne d'une trace d'erreur nomme le genre d'erreur ?
    • La première ligne
    • La ligne File
    • La dernière ligne
    • La ligne avec les marques ^
  2. Quelle erreur int("12a") provoque-t-il ?
    • TypeError
    • ValueError
    • NameError
    • SyntaxError
  3. Quelle erreur pritn("hi") provoque-t-il ?
    • SyntaxError
    • NameError
    • TypeError
    • Aucune erreur
  4. Un programme affiche la ligne 1 puis s'arrête avec une erreur à la ligne 2. Quel genre d'erreur ne peut pas en être la cause ?
    • SyntaxError
    • NameError
    • TypeError
    • ZeroDivisionError
  5. Qu'affiche ce code ?
    try:
        x = 10 / 0
    except ZeroDivisionError:
        x = -1
    print(x)
  6. Que se passe-t-il quand ce code s'exécute ?
    print("start")
    print(5 / 0)
    print("end")
    • Il affiche start et end
    • Il affiche start, puis s'arrête avec ZeroDivisionError
    • Il s'arrête avec ZeroDivisionError avant d'afficher quoi que ce soit
    • Il affiche start, inf et end
  7. Un programme s'exécute sans aucun message mais affiche le mauvais total. De quel genre d'erreur s'agit-il ?
    • SyntaxError
    • Erreur de logique
    • NameError
    • IndentationError
  8. Qu'affiche ce code ?
    spent = {"a": 4500, "b": 10000}
    print(30000 - sum(spent.values()))
  9. Mets les lignes de ce petit programme dans l'ordre pour qu'il affiche le résultat ci-dessous.
    Sortie
    80.0
  10. Où est le bug ? def avg(nums) : return sum(nums) / len(nums), appelée avec avg([]).
    • sum d'une liste vide est une erreur
    • len([]) vaut 0, donc on divise par zéro
    • return ne peut pas contenir de division
    • Il n'y a pas de bug
Erreurs fréquentes
  • « L'erreur est à la ligne que le message nomme, donc la correction va là. » Souvent, mais pas toujours. Dans l'unité sur les fonctions, x = show_area(4, 3) suivi de x * 2 s'arrête avec un TypeError à la ligne x * 2, pourtant la vraie erreur est le print dans show_area qui aurait dû être un return. Lis la ligne nommée, puis demande-toi d'où venaient ses valeurs.
  • « Tout entourer de try/except corrige les erreurs. » Cela ne fait que les cacher. Attrape une erreur précise que tu attends, comme ValueError avec int(input()), et traite-la de façon sensée.
  • « Pas de message d'erreur veut dire que le programme est correct. » Les erreurs de logique s'exécutent en silence. Teste avec des entrées dont tu connais déjà la réponse, y compris des cas limites comme une liste vide ou un âge limite.
Note du professeurRends les messages d'erreur ordinaires. Une bonne routine : avant de corriger quoi que ce soit, l'apprenant lit la dernière ligne à voix haute, puis dit le numéro de ligne, puis montre du doigt les marques ^. Des programmes volontairement cassés (une SyntaxError, une NameError, une TypeError) font un bon échauffement rapide. Le programme coréen d'informatique au collège demande d'analyser les résultats avec un débogueur et de corriger les erreurs ; IDLE en a un simple dans le menu Debug, mais les lignes print et les tableaux de suivi font le même travail à ce niveau. Le projet d'argent de poche correspond au standard suivant, résoudre un problème de la vie réelle avec un programme, et peut s'adapter à un budget de goûter de classe ou à un carnet de lecture.
L'essentiel
  • Lis une trace d'erreur de bas en haut : type d'erreur, puis fichier et ligne, puis code marqué.
  • Une SyntaxError arrête le programme avant l'exécution de la ligne 1 ; les autres erreurs l'arrêtent en cours de route.
  • try/except traite une erreur que tu attends.
  • Les erreurs de logique ne donnent aucun message : suis les variables et teste avec des réponses connues.
  • Déboguer, c'est casser et réparer exprès jusqu'à ce que les messages paraissent ordinaires.
Sources de ce cours (6)
  • Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
  • Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
  • Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
  • General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
  • Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
  • Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)

Consulté le: 2026-10-19