Direkt zum Hauptinhalt springen
eLearner.app
Modul 7 · Lektion 4 von 428/32 im Kurs~12 min
Lektionen des Moduls (4/4)

Fehler in asynchronem Code

Asynchrone Operationen schlagen anders fehl als synchrone: Der Fehler tritt nicht sofort auf, sondern „später“, wenn das Promise in den Zustand rejected übergeht. Schauen wir uns die zwei wichtigsten Werkzeuge an.

try/catch mit await

Wenn du await vor ein Promise setzt, das fehlschlägt, wird der Fehler wie eine normale Ausnahme erneut geworfen: Du fängst ihn mit try/catch ab.

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;
  }
}

Dies ist das am einfachsten zu lesende Pattern: Du schreibst den linearen Erfolgsfall („happy path“) und behandelst alle Fehler in einem einzigen Block.

.catch bei einem Promise

Im Kettenstil (Chaining):

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

.catch fängt jeden Fehler ab, der in der vorherigen Kette geworfen wurde.

Promise.all scheitert beim ersten 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'
}

Die anderen Promises laufen im Hintergrund weiter, aber Promise.all entscheidet sich beim ersten Fehler. Wenn du die Ergebnisse aller Promises haben möchtest (einschließlich der Fehlschläge), verwende Promise.allSettled:

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

Probier es aus

Übung#js.m7.l4.e1
Versuche: 0Wird geladen…

Definiere `readOrFallback(p, fallback)` als async: Versucht, das Promise p abzuwarten (await). Wenn es rejected wird, gib fallback zurück.

Editor wird geladen…
Hinweis anzeigen

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

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#js.m7.l4.e2
Versuche: 0Wird geladen…

Definiere `allOrNothing(promises)` als async: Verwende Promise.all. Wenn mindestens eines fehlschlägt, gib ein leeres Array [] zurück. Andernfalls gib die Werte zurück.

Editor wird geladen…
Hinweis anzeigen

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

Lösung nach 3 Versuchen verfügbar