Propagarea excepțiilor în JavaScript
Să considerăm blocul catch din sarcina cu JSON-ul produsului:
catch (error) {
if (error.name == 'SyntaxError') {
alert('JSON incorect pentru produs');
} else if (error.name == 'ProductCostError') {
alert('Produsului îi lipsește prețul sau cantitatea');
}
}
După cum vedeți, prindem două excepții planificate
de noi și reacționăm cumva la acestea.
Dar ce se va întâmpla dacă apare o excepție
neprevăzută de noi de alt tip? În acest caz,
ea va intra și ea în blocul catch, dar
nu va urma nicio reacție, deoarece
excepția cu alt tip pur și simplu nu va intra
în niciunul dintre condițiile noastre if.
Când spun că nu va fi nicio reacție, mă refer că literalmente nicio reacție: nici măcar nu va apărea o eroare în consolă. Codul nostru va eșua în tăcere.
De aceea există următoarea regulă: codul vostru
ar trebui să prindă doar acele excepții cu
care știe să se ocupe. Dacă excepția
este necunoscută, atunci ea trebuie propagată
mai departe cu ajutorul lui throw. În acest caz,
mai sus o va prinde cineva mai informat
sau excepția va apărea ca eroare în consolă.
Să corectăm codul nostru:
catch (error) {
if (error.name == 'SyntaxError') {
alert('JSON incorect pentru produs');
} else if (error.name == 'ProductCostError') {
alert('Produsului îi lipsește prețul sau cantitatea');
} else {
throw error; // propagăm excepția mai departe
}
}
Este dat următorul cod:
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('s-a epuizat spațiul din stocare');
}
if (error.name == 'SyntaxError') {
alert('JSON incorect');
}
}
Ce nu este în regulă cu acest cod? Corectați-l cu o versiune mai bună.