Lezioni del modulo (4/4)
try / catch / throw
Un errore in JavaScript è un valore (di solito un oggetto Error) che interrompe il
flusso normale e risale lo stack di chiamate finché qualcuno non lo cattura. Il costrutto per
gestire questa eventualità è try / catch.
Sollevare un errore: throw
function dividi(a, b) {
if (b === 0) {
throw new Error('Divisione per zero');
}
return a / b;
}throw interrompe immediatamente la funzione corrente.
Catturare: try / catch
try {
const r = dividi(10, 0);
console.log('ok', r);
} catch (err) {
console.log('errore:', err.message); // 'errore: Divisione per zero'
}
// Il programma continua qui, anche se c'è stato un errore.Tutto quello che è dentro try viene eseguito; se viene lanciato un errore (con throw o da
qualunque operazione che fallisce), il controllo salta al blocco catch. La variabile dopo
catch (...) riceve l'errore.
finally (opzionale)
Codice che gira sempre, errore o no. Utile per chiudere risorse:
try {
// ... operazione rischiosa
} catch (err) {
// ... log
} finally {
// ... pulizia (sempre eseguita)
}Quando usarlo (e quando no)
- Sì: operazioni I/O (
JSON.parsesu input non fidato,fetch, accesso disco), conversioni che possono fallire. - Forse no: per il flusso normale. Se sai che un input può essere invalido, è meglio
controllarlo con un
ifche lanciare e catturare.
// Tipico: parsing JSON difensivo
function parseJsonSafe(text) {
try {
return { ok: true, value: JSON.parse(text) };
} catch (err) {
return { ok: false, error: err.message };
}
}
parseJsonSafe('{"a":1}'); // { ok: true, value: {a:1} }
parseJsonSafe('non json'); // { ok: false, error: '...' }Prova tu
Definisci `safeDivide(a, b)`: se b è 0 lancia un Error con messaggio 'Divisione per zero', altrimenti restituisce a/b.
Mostra suggerimento
if (b === 0) throw new Error('...'); poi return a / b.
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Definisci `parseJsonSafe(text)`: se text è JSON valido restituisce { ok: true, value: <oggetto> }, altrimenti { ok: false }. Usa try/catch su JSON.parse.
Mostra suggerimento
Avvolgi JSON.parse in try; nel catch restituisci { ok: false }.
Soluzione disponibile dopo 3 tentativi