throw

Lève une exception : interrompt le code en cours et transmet l’erreur au bloc catch le plus proche.

Sur cette page

Exemple

#
JavaScript
function useFuel(fuel, amount) {
  if (amount > fuel) {
    throw new RangeError('Pas assez de carburant')
  }
  return fuel - amount
}

try {
  console.log(useFuel(10, 3))
  console.log(useFuel(10, 20))
} catch (error) {
  console.log(error.name, error.message)
}
Console
7
RangeError Pas assez de carburant

Définition et utilisation

#

L’instruction throw signale une erreur. L’exécution de la fonction s’interrompt immédiatement, et l’erreur remonte à travers les appels successifs jusqu’à atteindre un bloc catch. Si personne ne l’attrape, elle apparaît dans la console comme une erreur non traitée.

On peut lever n’importe quelle valeur, mais utilisez toujours des objets Error ou ses variantes, par ex. TypeError et RangeError. Ils ont des champs name et message, ainsi qu’une pile d’appels (stack), qui montre où le problème est né.

Pour les erreurs propres à votre domaine, vous pouvez créer votre propre classe héritant de Error. L’option cause permet de joindre l’erreur d’origine quand vous l’enveloppez dans un message plus compréhensible : new Error("Progression non enregistrée", { cause: error }).

Syntaxe

#
Syntaxe
throw expression
throw new Error(message)
throw new Error(message, { cause })

Plus d’exemples

#
Une classe d’erreur personnalisée
JavaScript
class ValidationError extends Error {
  constructor(field, message) {
    super(message)
    this.name = 'ValidationError'
    this.field = field
  }
}

function validateEmail(email) {
  if (!email.includes('@')) {
    throw new ValidationError('email', 'Caractère @ manquant')
  }
  return true
}

try {
  validateEmail('lea.example.com')
} catch (error) {
  console.log(error instanceof ValidationError, error.field)
  console.log(error)
}
Console
true email
ValidationError: Caractère @ manquant
Envelopper une erreur avec cause
JavaScript
function saveProgress(data) {
  try {
    JSON.parse(data)
  } catch (error) {
    throw new Error('Progression non enregistrée', { cause: error })
  }
}

try {
  saveProgress('{cassé')
} catch (error) {
  console.log(error.message)
  console.log(error.cause.name)
}
Console
Progression non enregistrée
SyntaxError
Piège : lever une chaîne
JavaScript
try {
  throw 'Quelque chose s’est mal passé'
} catch (error) {
  console.log(typeof error, error.message)
}
Console
string undefined

Une chaîne levée n’a pas de champ message ni de pile d’appels. C’est pourquoi il faut toujours lever des objets Error.

Compatibilité des navigateurs

#

Largement disponible

Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.

  • Chrome
  • Edge
  • Firefox
  • Safari

Bonnes pratiques

#
  • Levez une erreur dès que vous détectez de mauvaises données, et écrivez un message qui dit quoi corriger. « Les points doivent être un nombre » aidera plus que « Erreur ».
  • Dans une fonction async, l’instruction throw rejette la promesse renvoyée. Vous la traiterez avec try...catch et await, ou avec .catch().
  • N’utilisez pas les exceptions pour le contrôle normal du programme, par ex. pour sortir d’une boucle. Elles sont destinées aux situations exceptionnelles.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.