Error en JavaScript : l'objet qui décrit ce qui a échoué

Un objet Error porte un nom, un message et une pile d'appels : les types natifs, comment le lancer, l'attraper et définir le sien.
3 min de lecture
Believemy logo

Un programme qui échoue en silence coûte plus cher qu'un programme qui s'arrête. Encore faut-il que l'échec transporte de quoi comprendre : ce qui a cassé, où, et pourquoi.

C'est le rôle de l'objet Error, seul objet du langage qui capture l'endroit exact où il a été créé.


Définition

Un Error est un objet qui décrit un échec. Il porte trois propriétés : name, le type d'erreur, message, la description lisible, et stack, la suite des appels ayant mené jusque-là.

JAVASCRIPT
function diviser(a, b) {
  if (b === 0) throw new Error("Division par zéro");
  return a / b;
}

try {
  diviser(10, 0);
} catch (err) {
  console.log(err.name, "|", err.message);   // Error | Division par zéro
} finally {
  console.log("toujours exécuté");
}

throw interrompt la fonction sur-le-champ et remonte de niveau en niveau jusqu'au premier try rencontré. Sans catch nulle part, l'exécution s'arrête et le message part dans la console.


Les types natifs

Le langage lève lui-même des erreurs typées. Reconnaître le nom fait gagner beaucoup de temps.

TypeQuand il apparaît
TypeErrorUne valeur n'a pas la forme attendue
ReferenceErrorUn nom utilisé n'existe nulle part
SyntaxErrorLe code ou le JSON est mal formé
RangeErrorUne valeur sort des bornes permises

Tous héritent de Error, donc err instanceof Error vaut true pour chacun. Le test instanceof sur le type précis, lui, permet de traiter un cas particulier.


Définir son propre type d'erreur

Une class qui extends Error suffit à créer un type reconnaissable, auquel on ajoute les champs utiles au traitement.

JAVASCRIPT
class ErreurDePaiement extends Error {
  constructor(message, code) {
    super(message);
    this.name = "ErreurDePaiement";
    this.code = code;
  }
}

try {
  throw new ErreurDePaiement("Carte refusée", "card_declined");
} catch (err) {
  if (err instanceof ErreurDePaiement) console.log(err.code);   // card_declined
}
Bon à savoir

Le second argument de new Error conserve l'erreur d'origine : new Error("Configuration illisible", { cause: erreurBasse }). Le champ cause évite de choisir entre un message parlant et la trace technique, puisque les deux voyagent ensemble.


Questions fréquentes

Question

Peut-on lancer autre chose qu'un Error ?

Le langage l'autorise, une chaîne ou un objet passent très bien. C'est pourtant à éviter : la valeur lancée n'aura ni name, ni stack, et le code qui l'attrape ne saura pas d'où elle vient. Une chaîne lancée fait perdre l'essentiel du diagnostic.

Question

Que contient exactement stack ?

La suite des appels ayant mené à la création de l'objet, sous forme de texte. Son format n'est pas normalisé et varie d'un moteur à l'autre : servez-vous-en pour les journaux et le débogage, jamais comme d'une donnée à analyser.

Question

Comment distinguer une erreur attendue d'un vrai défaut ?

En définissant un type pour la première. Un panier vide ou une carte refusée relèvent du parcours normal et se rattrapent, un TypeError signale un défaut à corriger. Cette séparation structure la gestion des pannes côté serveur, un sujet traité dans la formation Node.js.

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.