Propagazione delle eccezioni in JavaScript
Consideriamo il blocco catch del task con il JSON del prodotto:
catch (error) {
if (error.name == 'SyntaxError') {
alert('JSON del prodotto non valido');
} else if (error.name == 'ProductCostError') {
alert('Il prodotto non ha prezzo o quantità');
}
}
Come puoi vedere, intercettiamo due eccezioni
da noi previste e reagiamo in qualche modo.
Ma cosa succede se si verifica un'eccezione
non prevista di tipo diverso? In questo caso
finirà anche essa nel blocco catch, ma
non ci sarà alcuna reazione,
poiché un'eccezione di tipo diverso semplicemente non rientrerà
in nessuno dei nostri if.
Quando dico che non ci sarà alcuna reazione, intendo proprio nulla: non ci sarà nemmeno un errore stampato in console. Il nostro codice semplicemente non funzionerà in silenzio.
Pertanto, esiste la seguente regola: il tuo
codice dovrebbe catturare solo le eccezioni
con cui sa come gestirle. Se l'eccezione
non è conosciuta, deve essere propagata
oltre utilizzando throw. In questo caso
verrà catturata da qualcuno più informato
oppure l'eccezione verrà stampata come errore in console.
Correggiamo il nostro codice:
catch (error) {
if (error.name == 'SyntaxError') {
alert('JSON del prodotto non valido');
} else if (error.name == 'ProductCostError') {
alert('Il prodotto non ha prezzo o quantità');
} else {
throw error; // propagiamo l'eccezione oltre
}
}
È dato il seguente codice:
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('spazio di archiviazione esaurito');
}
if (error.name == 'SyntaxError') {
alert('JSON non valido');
}
}
Cosa non va in questo codice? Correggilo in modo più appropriato.