Les types d'erreurs
Distinguer erreur de syntaxe, erreur à l’exécution et erreur logique.
Objectifs
À la fin de cette leçon, vous saurez :
- classer une erreur en trois familles : syntaxe, exécution, logique ;
- lire le message d'erreur comme une information, pas comme un échec ;
- savoir quel type d'erreur se détecte à quel moment.
Pourquoi ce classement
« Ça ne marche pas » n'aide jamais. Nommer précisément la famille du problème oriente directement la méthode de recherche :
| Famille | Détectée | Symptôme |
|---|---|---|
| Erreur de syntaxe | avant l'exécution | le programme refuse de démarrer |
| Erreur à l'exécution | pendant l'exécution | le programme plante en cours de route |
| Erreur logique | par l'humain | aucun crash, mais résultat faux |
Erreur de syntaxe
Le code viole la grammaire du langage : Node refuse de le lire entièrement.
const total = (4 + 5 * 2;
// SyntaxError: missing ) after argument list
Caractéristiques :
- aucune ligne du fichier ne s'exécute ;
- le message indique souvent la position exacte (fichier:ligne:colonne) ;
- causes fréquentes : parenthèse/accolade non fermée, virgule manquante dans un objet,
:au lieu de=.
Erreur à l'exécution
La syntaxe est valide ; le programme démarre, puis rencontre quelque chose d'impossible.
const notes = null;
console.log(notes.length);
// TypeError: Cannot read properties of null (reading 'length')
Erreurs d'exécution courantes en JavaScript :
| Message | Cause typique |
|---|---|
ReferenceError: x is not defined | nom mal orthographié ou variable jamais déclarée |
TypeError: cannot read properties of undefined | accès à une propriété d'un objet inexistant |
TypeError: x is not a function | appel de quelque chose qui n'est pas une fonction |
RangeError: Invalid array length | taille de tableau invalide |
Ces erreurs arrêtent le programme : tout ce qui devait suivre n'est pas fait.
Erreur logique
Le pire des trois : rien ne plante, mais le résultat est faux.
function moyenne(notes) {
let total = 0;
for (const note of notes) {
total += note;
}
return total / (notes.length - 1); // bug silencieux !
}
console.log(moyenne([12, 14, 16])); // 21 : aucun crash… et pourtant
Aucun outil automatique ne peut savoir que vous vouliez diviser par notes.length. Seuls les tests et la vérification des résultats attendus la débusquent — c'est pour cela que chaque exercice de ce cours vous fait prédire les résultats avant d'exécuter.
Aperçu des erreurs réseau et HTTP
Plus tard dans le cursus apparaîtront d'autres familles, mentionnées ici pour situer le paysage :
- erreur réseau : la machine joignable hier ne répond plus (serveur éteint, câble débranché) ;
- erreur HTTP : le serveur répond, mais pas avec ce qu'on attendait (404 : ressource absente ; 500 : son propre plantage) ;
- erreur de base de données : requête invalide, contrainte violée.
Même mécanisme mental : lire le message, localiser, comprendre la cause avant de modifier quoi que ce soit.
Ces familles seront traitées là où elles vivent vraiment : les erreurs réseau au chapitre 8 (ping, traceroute, ports fermés), les erreurs HTTP au chapitre 11 (codes de statut), les erreurs SQL au chapitre 20 (contraintes violées). Pour l'instant, retenez leur existence et le réflexe : identifier la famille avant de chercher la cause.
Exercice
Classez chaque situation (syntaxe / exécution / logique) :
console.log("bonjour"— parenthèse jamais fermée.- Une fonction renvoie toujours
false, même quand elle devrait renvoyertrue. let x = valeurInconnue;oùvaleurInconnuen'existe nulle part.- Le programme affiche la liste triée décroissante alors qu'on voulait croissante.
const liste = [{nom:"a"}]; console.log(liste[1].nom);- Un serveur répond
404à votre requête.
Résumé
- Syntaxe : refuse de démarrer, signalée avant toute exécution.
- Exécution : démarre puis plante ; message + stack trace sont vos alliés.
- Logique : silencieuse ; seules des vérifications attendues la révèlent.
- Le premier réflexe professionnel : lire le message jusqu'au bout.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
1. Syntaxe. Node signale l'accolade/parenthèse manquante avant d'exécuter quoi que ce soit.
2. Logique. Le programme tourne, aucune exception : seul le résultat faux trahit le bug (condition inversée, mauvais opérateur de comparaison).
3. Exécution (ReferenceError). La syntaxe est parfaite ; le plantage survient quand la ligne s'exécute et cherche un nom introuvable.
4. Logique. Tri effectué, sens inversé : probablement b - a au lieu de a - b dans le comparateur, ou comparaison > au lieu de <.
5. Exécution (TypeError). liste[1] vaut undefined (le tableau n'a qu'un élément), et lire .nom sur undefined est impossible.
6. HTTP — famille à venir dans le cursus. Le programme ne plante pas nécessairement : le serveur a répondu, simplement « cette ressource n'existe pas ». C'est au code client de vérifier le statut reçu.