--- title: Qu'est-ce qui n'a pas fonctionné ? Déboguer du code JavaScript slug: Learn/JavaScript/First_steps/What_went_wrong tags: - Apprentissage - Article - Codage - Débutant - Erreur - JavaScript - Tutoriel - console.log - débogage - outils de développement translation_of: Learn/JavaScript/First_steps/What_went_wrong ---
Après avoir créé le jeu "Devinez le nombre" de l'article précédent, vous avez peut-être constaté qu'il ne fonctionnait pas. Pas de panique — cet article vise à ce que vous ne vous arrachiez pas les cheveux sur ces problèmes en donnant quelques conseils simples sur la façon de trouver et corriger les erreurs dans les programmes JavaScript.
Prérequis : |
Vocabulaire courant de l'informatique, bases de HTML et CSS, compréhension de ce que fait JavaScript. |
---|---|
Objectif : | Acquérir la capacité et la confiance pour commencer à résoudre des problèmes simples dans votre propre code. |
En règle générale, les erreurs dans un code sont à ranger dans deux catégories :
Erreurs logiques : La syntaxe est correcte, mais le code n'est pas ce que vous attendiez : le programme tourne sans planter mais donne des résultats inattendus. Ces erreurs sont souvent plus difficiles à corriger que les erreurs de syntaxe, car il n'y a pas, en général, de message d'erreur pour vous diriger vers la source de l'erreur.
Bon, mais ce n'est pas si simple que cela — il y a d'autres facteurs de différenciation lorsque vous approfondissez. Mais la classification ci-dessus suffiira pour commencer. Nous examinerons ces deux catégories d'erreur un peu plus loin.
Pour commencer, revenons à notre jeu de devinettes numériques — sauf que cette fois-ci, nous explorerons une version qui comporte des erreurs délibérées. Allez sur Github et fabriquez vous-même une copie locale de number-game-errors.html (voyez-la ici en direct).
Note : Votre propre version de l'exemple de jeu ne fonctionne pas, vous pourriez vouloir la corriger ! Il nous semble plus efficace que vous travailliez sur notre version boguée, afin que vous puissiez apprendre les techniques que nous enseignons ici. Ensuite, vous pouvez revenir en arrière et essayer de réparer votre exemple.
À ce stade, consultons la console du développeur pour voir si nous pouvons voir des erreurs de syntaxe, puis essayez de les corriger. Vous apprendrez comment ci-dessous.
Antérieurement dans le cours, nous vous avons demandé de taper quelques commandes JavaScript simples dans la console JavaScript des outils de développement (si vous ne pouvez pas vous rappeler comment l'ouvrir dans votre navigateur, suivez le lien précédent pour savoir comment). Ce qui est encore plus utile, c'est que la console vous donne des messages d'erreur chaque fois qu'une erreur de syntaxe existe dans le JavaScript qui est introduit dans le moteur JavaScript du navigateur. Maintenant partons en chasse !
number-game-errors.html
, et ouvrez la console JavaScript. Vous devriez voir un message d'erreur dans les lignes qui suivent : guessSubmit.addeventListener('click', checkGuess);
addEventListener()
.addeventListener
par addEventListener
corrigera cela. Faisons‑le maintenant.Note : Voyez la page relative à TypeError: "x" is not a function pour plus de précisions à propos de cette erreur.
Null
est une valeur spéciale signifiant "rien" ou "aucune valeur". Or lowOrHi
a été déclaré et initialisé, mais sans valeur signifiante — il n'a ni type ni valeur.checkGuess() { ... }
). Comme vous l'apprendrez de manière plus précise plus loin dans l'article à propos des fonctions, le code dans les fonctions s'exécute dans une instance séparée du code en dehors des fonctions. Dans notre cas, le code n'avait pas été exécuté et l'erreur ne pouvait pas survenir avant que la fonction checkGuess()
soit lancée à la ligne 86.lowOrHi.textContent = 'Last guess was too high!';
textContent
de la variable lowOrHi
à l'aide d'une chaîne textuelle ; mais cela ne fonctionne pas car lowOrHi
ne contient pas ce qui est attendu. Voyons voir — recherchons d'autres occurrences de lowOrHi
dans le code. La plus proche que vous trouverez dans le JavaScript se situe à la ligne 48 :
let lowOrHi = document.querySelector('lowOrHi');
null
après que cette ligne ait été exécutée. Ajoutez le code suivant à la ligne 49 :
console.log(lowOrHi);
Note : console.log()
est vraiment utile pour déboguer une fonction en affichant sa valeur sur la console. Donc, elle affichera sur cette dernière la valeur de lowOrHi
que nous avons essayé de définir à la ligne 48.
console.log()
sur la console. C'est sûr, la valeur de lowOrHi
est null
à ce niveau ; il y a bien un problème à la ligne 48.document.querySelector()
pour obtenir une référence sur un élément avec un sélecteur CSS. En regardant plus en amont dans notre fichier, nous pouvons trouver le paragraphe en question :
<p class="lowOrHi"></p>
querySelector()
en ligne 48 n'en a pas. Ce pourrait être le problème ! Changeons lowOrHi
en .lowOrHi
à la ligne 48.console.log()
renvoie bien l'élément <p>
attendu. Pfff ! Une autre erreur corrigée ! On peut enlever la ligne console.log()
maintenant, ou bien la garder pour s'y reporter plus tard — comme vous l'entendez.Note : Voyez la page relative à TypeError: "x" is (not) "y" pour plus de précisions à propos de cette erreur.
addeventListener
en addEventListener
. Faites‑le.À ce stade, le jeu se déroule correctement, mais après avoir fait quelques parties, vous noterez sans doute que le nombre « aléatoire » à deviner est toujours 0 ou 1. Franchement, de quoi vous dégoûter de jouer !
Il y a sûrement un problème dans la logique du jeu quelque part — le jeu ne renvoie pas d'erreur ; il ne fonctionne pas correctement.
randomNumber
est définie. L'instance qui stocke en début de jeu le nombre aléatoire à deviner se situe autour de la ligne 44 :
let randomNumber = Math.floor(Math.random()) + 1;Et celle qui génére le nombre aléatoire pour une succession de jeux se situe autour de la ligne 113 :
randomNumber = Math.floor(Math.random()) + 1;
console.log()
— insérons la ligne suivante directement en dessous des deux lignes indiquées plus haut :
console.log(randomNumber);
randomNumber
est égal à 1 quel que soit le point où il est raccordé à la console.Pour corriger cela, examinons d'abord le fonctionnement de cette ligne. Premièrement, appelons Math.random()
, qui génére un nombre décimal aléatoire compris entre 0 et 1, par exemple 0.5675493843.
Math.random()
Puis, nous passons le résultat de l'appel de Math.random()
à Math.floor()
, qui arrondit le nombre passé à l'entier inférieur le plus proche. Puis, on ajoute 1 au résultat :
Math.floor(Math.random()) + 1
Garder la partie entière d'un nombre décimal compris entre 0 et 1 renvoie toujours 0, y ajouter 1 donne toujours 1. Il faut multiplier le nombre aléatoire par 100 avant de l'arrondir par défaut. La ligne suivante nous donne un entier aléatoire entre 0 et 99 :
Math.floor(Math.random()*100);
Maintenant ajoutons 1 pour obtenir un nombre aléatoire entre 1 et 100 :
Math.floor(Math.random()*100) + 1;
Modifiez ces deux lignes comme indiqué, enregistrez, actualisez — le jeu devrait maintenant fonctionner comme il faut !
D'autres erreurs courantes peuvent être commises en écrivant du code. Ce paragraphe attire votre attention sur la plupart d'entre elles.
Cette erreur signale généralement l'oubli du point‑virgule à la fin d'une ligne de code ; mais elle peut se révéler parfois plus énigmatique. Par exemple, si, dans la fonction checkGuess(),
nous modifions cette ligne :
let userGuess = Number(guessField.value);
en
let userGuess === Number(guessField.value);
cela déclenchera cette même erreur car le logiciel pense que vous êtes en train de faire quelque chose d'autre. Vous devez vous assurer que vous n'avez pas confondu l'opérateur d'assignation (=
) — qui fixe une valeur donnée à une variable — avec l'opérateur (===
) qui teste la stricte égalité de deux valeurs, et renvoie un résultat true
/false
(vrai/faux).
Note : Voyez la page relative à SyntaxError: missing ; before statement pour plus de précisions à propos de cette erreur.
Voilà un autre symptome de la confusion entre opérateur d'assignation et opérateur de test d'égalité. Ainsi, dans checkGuess()
, si vous modifiez cette ligne :
if (userGuess === randomNumber) {
en
if (userGuess = randomNumber) {
le test renverra toujours true
(vrai) et le programme indiquera que vous avez gagné à tout coup. Soyez attentif !
Cette erreur est triviale — elle indique en général que vous avez oublié une parenthèse fermante à la fin de l'appel d'une fonction ou d'une méthode.
Note: Voyez la page relative à SyntaxError: missing ) after argument list pour plus de précisions à ce propos.
Cette erreur concerne généralement un objet JavaScript mal construit, mais dans ce cas nous l'avons déclenchée en modifiant
function checkGuess() {
en
function checkGuess( {
Le navigateur pense que vous essayez de passer le contenu d'un fonction comme argument pour l'autre fonction. Soyez attentifs avec les parenthèses !
Facile — elle signifie généralement que vous avez omis une accolade dans une fonction ou dans une structure conditionnelle. Vous l'obtiendrez en effaçant une des accolades voisines de la terminaison de la fonction checkGuess()
.
Ces erreurs signalent généralement l'oubli de guillemets ouvrants ou fermants dans une chaîne littérale. Dans la première erreur du titre, string doit être remplacé par l'un ou les caractères inattendus que l'explorateur a trouvé à la place du guillemet en début de chaîne. La deuxième erreur indique que la chaîne n'a pas été clôturée avec un guillement fermant.
Pour toutes ces erreurs, revoyez comment nous avons opéré dans les exemples de ce parcours. Quand une erreur survient, regardez le numéro de ligne indiqué, allez à cette ligne et voyez si vous remarquez ce qui ne va pas. N'oubliez pas que l'erreur n'est pas forcément sur la ligne indiquée, et qu'elle ne provient pas forcément d'un des problèmes évoqués plus haut !
Note : Voyez les pages relatives à SyntaxError: Unexpected token et SyntaxError: unterminated string literal pour plus de précisions à ce propos.
Voilà ce que nous pouvons dire à propos des erreurs basiques pour de simples programmes JavaScript. Il n'est pas toujours aussi simple de détecter ce qui ne va pas dans du code, mais au moins vous économiserez ainsi quelques heures de veille et vous progresserez plus rapidement si les choses ne déraillent pas dès le début de votre parcours d'apprentissage.
{{PreviousMenuNext("Learn/JavaScript/First_steps/A_first_splash", "Learn/JavaScript/First_steps/Variables", "Learn/JavaScript/First_steps")}}