Javascript Exceptions: try, catch (e), throw
try catch (e) throw testet einen Codeblock auf Fehler – nicht auf Syntaxfehler wie onerror –, sondern auf Laufzeitfehler. try catch baut eine Umleitung ein, damit die Ausführung nach dem Fehler weitergeführt werden kann. Damit try catch funktioniert, muss der Code frei von Syntaxfehlern sein.
Fehlerursachen vorhersehen
Fehler entstehen durch fehlerhafte Anweisungen, durch fehlende oder falsche Eingaben, die miesen kleinen Fallen lauern in unvorhergesehenen Umständen und Ereignissen. try {} catch {} kann zunächst nur Fehler abfangen, die sofort passieren – also für synchronen Code.
try {
JSON.parse("{ ungültig"); // wirft sofort einen Fehler
} catch (err) {
console.log("Fehler abgefangen!");
}
Promises hingegen fangen Fehler für asynchronen Code ab. Ein Promise wirft seine Fehler nicht synchron, sondern über seinen eigenen Mechanismus:
- Erfolgsfall → .then()
- Fehlerfall → .catch()
fetch("url")
.then(response => ...)
.catch(err => console.error("Fehler im Fetch", err));
Dieser Fehler tritt sich sofort ein, sondern später. Ein normaler try/catch würde diesen Fehler gar nicht erkennen.
async/await verbindet beide Welten
Wenn ein Funktionsblock async ist, können Promises behandeln werden, als wären sie synchron. await leitet Promise-Fehler in den normalen try/catch-Kanal um.
async function load() {
try {
const data = await fetch("url"); // Fehler landet im catch
} catch (err) {
console.log("Fehler abgefangen!");
}
}
Exceptions – Ausnahme-Zustände
Javascript hat schon seit Version 4.1 den try-catch()-Block mit dem »Werfen von Ausnahmen« Throw Exception. Jetzt sind wir also nicht mehr den Browsern ausgeliefert, die uns ihre Fehlermeldungen vor die Füße werfen und dann aussteigen, sondern können eine Umleitung einbauen. Browser haben viele Fehlermeldung fertig auf Lager, die aber nicht direkt die Fehlerquelle aufdecken. Scripte können ihre eigenen Exceptions mit der Anweisung throw werfen. Die Exception kann ein String, eine Zahl oder ein Objekt sein.
throw kann in async-Funktionen ganz normal benutzt werden:
async function load() {
const res = await fetch("url");
if (!res.ok) {
throw new Error("HTTP-Fehler!");
}
return res.json();
}
Bei größeren Programmen überwiegt das Error Handling – die Behandlung von Fehlern und Ausnahmen – schnell die Logik des Programms. try … catch () … throw behandelt Fehler an zentraler Stelle und gestaltet den Code lesbarer.
- try {}
- testet einen Codeblock auf Fehler
- catch {}
- reagiert auf den Fehler und erledigt die Fehlerbehandlung
- throw {}
- erzeugt eigene Fehlermeldungen
- finally {}
- führt Anweisungen im Anschluss an try und catch aus, ob nun Fehler aufgetreten sind oder nicht und egal wie das Ergebnis aussah.