⊗jsSpExcPrb 150 of 294 menu

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.

ptenituzluzc