throw
Lève une exception : interrompt le code en cours et transmet l’erreur au bloc catch le plus proche.
Exemple
#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)
}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
#throw expression
throw new Error(message)
throw new Error(message, { cause })Plus d’exemples
#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)
}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)
}try {
throw 'Quelque chose s’est mal passé'
} catch (error) {
console.log(typeof error, error.message)
}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’instructionthrowrejette la promesse renvoyée. Vous la traiterez avectry...catchetawait, 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
#- try...catchCapture les erreurs levées dans un bloc try et les traite dans catch. Un finally optionnel s’exécute toujours.
- classDéfinit une classe, c’est-à-dire un modèle pour créer des objets avec les mêmes champs et méthodes.
- Promise.prototype.catch()Enregistre une fonction de gestion d’erreur, appelée quand la promesse est rejetée.
- async functionDéclare une fonction asynchrone, qui renvoie toujours une promesse et peut utiliser le mot-clé await à l’intérieur.
- ErrorUn objet d’erreur intégré avec un message et une pile d’appels. La base des exceptions et des classes d’erreurs personnalisées.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.