SyntaxError en JavaScript : du code ou du JSON mal formé

Un SyntaxError survient quand le texte lu ne respecte pas la grammaire du langage : pourquoi il précède l'exécution, et le cas très fréquent de JSON.parse.
3 min de lecture
Believemy logo

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.

MomentExempleAttrapable ?
À l'analyse du fichierUne accolade non ferméeNon, le fichier entier est rejeté
Pendant l'exécutionJSON.parse, new FunctionOui, 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.

JAVASCRIPT
// 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.

JAVASCRIPT
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 input

Un 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.

Bon à savoir

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

Question

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.


Question

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.


Question

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.

Termes connexes

Découvrez notre glossaire JavaScript

Tous les mots de JavaScript expliqués simplement : mots-clés, objets natifs, méthodes, erreurs et concepts. Définitions claires et exemples qui tournent, pour apprendre et pour se dépanner.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.