Propagation des exceptions en JavaScript
Considérons le bloc catch de la tâche avec le JSON du produit :
catch (error) {
if (error.name == 'SyntaxError') {
alert('JSON du produit incorrect');
} else if (error.name == 'ProductCostError') {
alert('Le produit n\'a pas de prix ou de quantité');
}
}
Comme vous le voyez, nous attrapons deux exceptions
prévues par nous et réagissons d'une certaine manière.
Mais que se passera-t-il si une exception non prévue
par nous d'un autre type se produit ? Dans ce cas,
elle entrera également dans le bloc catch, mais
aucune réaction ne s'ensuivra, car
l'exception d'un autre type n'entrera simplement
dans aucun de nos if.
Quand je dis qu'il n'y aura aucune réaction, je veux dire, vraiment aucune : il n'y aura même pas d'affichage de l'erreur dans la console. Notre code ne fonctionnera tout simplement pas en silence.
C'est pourquoi il existe la règle suivante : votre
code ne doit attraper que les exceptions avec
lesquelles il sait comment gérer. Si l'exception
est inconnue, elle doit être propagée
plus loin à l'aide de throw. Dans ce cas,
elle sera attrapée plus haut par quelqu'un de plus informé
ou l'exception s'affichera comme une erreur dans la console.
Corrigeons notre code :
catch (error) {
if (error.name == 'SyntaxError') {
alert('JSON du produit incorrect');
} else if (error.name == 'ProductCostError') {
alert('Le produit n\'a pas de prix ou de quantité');
} else {
throw error; // on propage l'exception plus loin
}
}
Le code suivant est donné :
try {
let arr = JSON.parse(json);
for (let i = 0; i < arr.length; i++) {
localStorage.setItem(i, arr[i]);
}
} catch (error) {
if (error.name == 'QuotaExceededError') {
alert('espace de stockage épuisé');
}
if (error.name == 'SyntaxError') {
alert('JSON incorrect');
}
}
Qu'est-ce qui ne va pas avec ce code ? Corrigez-le par une version plus appropriée.