Vai al contenuto
eLearner.app
Modulo 7 · Lezione 4 di 428/32 nel corso~12 min
Lezioni del modulo (4/4)

Errori in codice asincrono

Le operazioni asincrone falliscono in modo diverso da quelle sincrone: l'errore non arriva subito, arriva "dopo", quando la Promise va in stato rejected. Vediamo i due strumenti principali.

try/catch con await

Quando metti await davanti a una Promise che fallisce, l'errore viene rilanciato come una normale eccezione: lo catturi con try/catch.

JS
async function leggiSicuro() {
  try {
    const r = await fetch('/api/cose');
    if (!r.ok) throw new Error('HTTP ' + r.status);
    return await r.json();
  } catch (err) {
    console.error('errore di rete:', err.message);
    return null;
  }
}

È il pattern più leggibile: scrivi il "happy path" lineare, e gestisci tutto in un blocco unico.

.catch su una Promise

In stile catena:

JS
fetch('/api/cose')
  .then((r) => r.json())
  .then((dati) => console.log(dati))
  .catch((err) => console.error(err));

.catch cattura qualunque errore lanciato lungo la catena precedente.

Promise.all fallisce alla prima rejection

JS
const ps = [Promise.resolve(1), Promise.reject(new Error('no')), Promise.resolve(3)];
try {
  const r = await Promise.all(ps);
} catch (err) {
  console.log(err.message); // 'no'
}

Le altre Promise continuano a girare in background, ma Promise.all si "decide" sul primo errore. Se vuoi i risultati di tutte (inclusi i fallimenti), usa Promise.allSettled:

JS
const esiti = await Promise.allSettled(ps);
// [{ status: 'fulfilled', value: 1 },
//  { status: 'rejected', reason: Error('no') },
//  { status: 'fulfilled', value: 3 }]

Prova tu

Esercizio#js.m7.l4.e1
Tentativi: 0Caricamento…

Definisci `readOrFallback(p, fallback)` async: prova ad attendere la Promise p; se è rejected ritorna fallback.

Caricamento editor…
Mostra suggerimento

try { return await p; } catch { return fallback; }

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#js.m7.l4.e2
Tentativi: 0Caricamento…

Definisci `allOrNothing(promises)` async: usa Promise.all. Se almeno una fallisce, ritorna l'array vuoto []. Altrimenti ritorna i valori.

Caricamento editor…
Mostra suggerimento

try { return await Promise.all(promises); } catch { return []; }

Soluzione disponibile dopo 3 tentativi