Kodokon kodokon.com

Lire et comprendre un message d'erreur

Apprenez à décoder un message d'erreur au lieu de le fermer : type, fichier, ligne et pile d'appels.

8 min · 3 questions

Ouvrir cette leçon dans Kodokon

Une erreur n'est pas une punition. Votre ordinateur ne vous juge pas et ne se moque pas de vous : il constate qu'il ne sait pas quoi faire, et il vous explique pourquoi. C'est exactement comme un GPS qui annonce « recalcul de l'itinéraire » : ce n'est pas un reproche, c'est une information. Le réflexe du débutant est de fermer la fenêtre rouge sans la lire. Le réflexe du développeur est de la lire lentement, jusqu'au bout. C'est souvent le seul moment où la machine vous parle en toutes lettres.

Presque tous les messages d'erreur contiennent les mêmes informations. Le type d'erreur, qui la classe dans une grande famille. Le message, qui explique en une phrase ce qui coince. Le fichier concerné et le numéro de ligne, qui vous disent exactement où regarder. Et parfois une pile d'appels (on dit souvent *stack trace* en anglais) : la liste des étapes que le programme a parcourues avant de tomber en panne.

PYTHON
Traceback (most recent call last):
  File "courses.py", line 12, in <module>
    total = prix * quantite
NameError: name 'quantite' is not defined
Un message Python : le fichier, la ligne 12, le type NameError et son explication.

Dans l'exemple ci-dessus, tout est dit. Le fichier est courses.py, la ligne est la 12, le type est NameError et le message précise name 'quantite' is not defined, c'est-à-dire « le nom quantite n'existe pas ». Traduction en français courant : à la ligne 12, vous utilisez une variable quantite que vous n'avez jamais créée, ou dont vous avez mal orthographié le nom. Aucune enquête compliquée : le message contenait déjà la réponse.

Une pile d'appels Python se lit de bas en haut : la dernière ligne donne le type et l'explication, et juste au-dessus se trouvent le fichier et la ligne fautive. Quand la pile est très longue, cherchez la première ligne qui mentionne votre fichier à vous. Les lignes qui citent des fichiers inconnus, aux noms bizarres, appartiennent aux bibliothèques que vous utilisez : dans 99 % des cas, ce n'est pas elles qui ont un bug, c'est la façon dont vous les appelez.

JAVASCRIPT
Uncaught TypeError: Cannot read properties of
undefined (reading 'nom')
    at afficherProfil (app.js:24:18)
    at demarrer (app.js:41:3)
Même logique dans la console du navigateur : fichier app.js, ligne 24, colonne 18.

Quelques formulations reviennent sans arrêt, il est rentable de les reconnaître. not defined signifie que le nom utilisé n'existe pas à cet endroit. undefined veut dire que la chose existe mais n'a aucune valeur. unexpected indique que le programme attendait autre chose, typiquement une parenthèse ou un guillemet oublié. permission denied signale un problème de droits, pas de code. Et no such file or directory veut dire que le chemin que vous avez écrit ne mène nulle part.

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Quelle information d'un message d'erreur vous dit où regarder en premier ?
    • Le nom du fichier et le numéro de ligne
    • La couleur du texte affiché
    • La longueur totale du message
    • Le nom de votre système d'exploitation
  2. Dans quel sens se lit une pile d'appels Python ?
    • De haut en bas : la première ligne donne la solution
    • De bas en haut : la dernière ligne donne le type et l'explication
    • Dans n'importe quel sens, elle est purement décorative
  3. Ce programme s'arrête sur NameError: name 'count' is not defined. Quel nom faut-il écrire dans le trou pour corriger l'erreur ?
    price = 10
    ___ = 3
    total = price * count
    print(total)
    • count
    • total
    • price
    • number