Cette erreur a une particularité qui la sépare de toutes les autres : elle survient le plus souvent avant que la moindre ligne ne s'exécute.
Ce qui explique un comportement déroutant la première fois qu'on le rencontre. Un try soigneusement posé autour du code fautif n'attrape rien du tout.
Définition
Un SyntaxError est levé quand un texte ne respecte pas la grammaire attendue. Deux moments très différents le produisent : l'analyse d'un fichier avant son exécution, et l'analyse d'une chaîne pendant l'exécution.
| Moment | Exemple | Attrapable ? |
|---|---|---|
| À l'analyse du fichier | Une accolade non fermée | Non, le fichier entier est rejeté |
| Pendant l'exécution | JSON.parse, new Function | Oui, par un try ordinaire |
Ces trois colonnes résument tout le sujet. Le premier cas se corrige dans l'éditeur, le second se traite dans le code.
Pourquoi le try ne sert à rien
Le moteur lit le fichier entier avant d'en exécuter la première instruction. Si l'analyse échoue, rien ne démarre : ni le try, ni le catch, ni les lignes qui précèdent.
// Ce fichier ne s'exécute pas du tout : le SyntaxError arrive à l'analyse
// try {
// const = 3;
// } catch (err) {
// console.log("jamais affiché");
// }
// Ici, l'erreur est bien attrapée : la chaîne est analysée à l'exécution
try {
new Function("const = 3");
} catch (err) {
console.log(err.name); // SyntaxError
}JSON.parse, le cas le plus fréquent
En pratique, le SyntaxError rencontré en production vient presque toujours de JSON. Une réponse serveur tronquée, une page d'erreur HTML servie à la place des données, une valeur vide : le contenu n'est pas du JSON valide.
const essais = ["{}", "", "{a:1}", "undefined"];
for (const texte of essais) {
try {
JSON.parse(texte);
console.log("valide :", texte);
} catch (err) {
console.log("invalide :", JSON.stringify(texte), "|", err.message);
}
}
// valide : {}
// invalide : "" | Unexpected end of JSON inputUn catch autour de chaque analyse est donc obligatoire dès que le texte vient de l'extérieur : réseau, fichier, stockage local ou saisie utilisateur.
Un message qui commence par « Unexpected token < » est un classique : le serveur a renvoyé une page HTML, souvent une page d'erreur ou une redirection de connexion. Vérifiez le code de statut de la réponse avant d'appeler JSON.parse, l'erreur devient alors parlante.
Questions fréquentes
Le numéro de ligne signalé est-il fiable ?
Il indique l'endroit où l'analyseur a compris que quelque chose n'allait pas, ce qui n'est pas toujours l'endroit de la faute. Une accolade oubliée cinquante lignes plus haut se signale souvent à la fin du fichier : remontez depuis le point signalé plutôt que de fixer la ligne indiquée.
Pourquoi une syntaxe récente provoque-t-elle cette erreur ?
Parce que l'environnement qui lit le fichier est plus ancien que la syntaxe employée. Un navigateur dépassé ou une version de Node.js trop basse ne connaît pas la construction et la refuse à l'analyse. La transpilation existe précisément pour réécrire le code dans une syntaxe plus ancienne.
Comment éviter d'en écrire ?
En laissant les outils s'en charger. Un formateur automatique repère l'immense majorité de ces fautes au moment de la sauvegarde, et l'éditeur souligne l'accolade orpheline avant même l'enregistrement. Le SyntaxError d'écriture est le plus facile à supprimer de la chaîne de développement.