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
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)Traceback (most recent call last):
File "main.py", line 3, in <module>
print(total / count)
~~~~~~^~~~~~~
ZeroDivisionError: division by zeroCommence 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.
| Erreur | Cause habituelle | Exemple |
|---|---|---|
| SyntaxError | La ligne n'est pas du Python valide : parenthèse, deux-points ou guillemet manquant | print("hi" |
| IndentationError | Indentation manquante ou irrégulière | if x > 1 : sans ligne indentée |
| NameError | Un nom qui n'existe pas encore, souvent une faute de frappe | pritn("hi") |
| TypeError | Une opération sur le mauvais type | "Age: " + 15 |
| ValueError | Bon type, valeur impossible | int("abc") |
| IndexError | Indice au-delà de la fin d'une liste ou d'une chaîne | [1, 2][2] |
| KeyError | Clé absente du dictionnaire | {"a": 1}["b"] |
| ZeroDivisionError | Division par zéro | 5 / 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")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)0Les 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")snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Spent 17000, left 13000
Less than half leftAvant 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 |
| SyntaxError | Du code invalide, trouvé avant que quoi que ce soit s'exécute |
| NameError | Un nom qui n'existe pas, souvent une faute de frappe |
| TypeError | Une opération sur le mauvais type de valeur |
| ValueError | Le bon type avec une valeur impossible, comme int("abc") |
| erreur de logique | S'exécute sans message mais donne la mauvaise réponse |
| try / except | Exécute le bloc except au lieu de s'arrêter quand cette erreur survient |
- 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 ^
- Quelle erreur
int("12a")provoque-t-il ?- TypeError
- ValueError
- NameError
- SyntaxError
- Quelle erreur
pritn("hi")provoque-t-il ?- SyntaxError
- NameError
- TypeError
- Aucune erreur
- 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
- Qu'affiche ce code ?
try: x = 10 / 0 except ZeroDivisionError: x = -1 print(x) - 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
- 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
- Qu'affiche ce code ?
spent = {"a": 4500, "b": 10000} print(30000 - sum(spent.values())) - Mets les lignes de ce petit programme dans l'ordre pour qu'il affiche le résultat ci-dessous.Sortie
80.0 - 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
- « 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.
- 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