W3docs

JavaScript Promise Fehlerbehandlung

JavaScript Promise Fehlerbehandlung: .catch(), Rejection-Weitergabe, erneutes Werfen, .finally(), das unhandledrejection-Ereignis und try/catch mit async/await.

JavaScript Promises sind ein grundlegender Bestandteil der Verwaltung asynchroner Operationen und ermöglichen es Entwicklern, asynchrone Ereignisse flexibler und einfacher zu behandeln (siehe JavaScript: Promises). Die Fehlerbehandlung bei Promises ist entscheidend für das Schreiben von robustem JavaScript-Code, der mit unerwarteten Problemen umgehen kann, ohne die Anwendung zum Absturz zu bringen.

Dieses Kapitel behandelt, wie Rejections abgefangen werden, wie Fehler durch eine Kette fließen, wie man sie erneut wirft und sich davon erholt, den .finally()-Bereinigungshook, das globale unhandledrejection-Sicherheitsnetz und wie dieselben Muster auf async/await übertragen werden. Wenn Sie neu bei der Verkettung von .then()-Aufrufen sind, lesen Sie zuerst Promises-Verkettung.

Ein Promise kann in einem von zwei Zuständen enden: fulfilled (es hat einen Wert erzeugt) oder rejected (etwas ist schiefgelaufen). Eine Rejection tritt auf, wenn Sie reject(...) aufrufen, wenn Sie throw innerhalb eines Executors oder eines .then()-Callbacks verwenden, oder wenn eine eingebaute asynchrone API fehlschlägt. Bei der Fehlerbehandlung geht es darum, diese Rejections an einen Handler weiterzuleiten, anstatt sie das Programm zum Absturz bringen zu lassen.

Die Fehlerbehandlung bei Promises wird mithilfe der .catch()-Methode oder durch Übergabe eines zweiten Arguments an die .then()-Methode erreicht. Beide Methoden bieten Möglichkeiten, Fehler zu verwalten und sich von ihnen zu erholen, die während der Ausführung asynchroner Operationen auftreten.

Verwendung der .catch()-Methode

Die .catch()-Methode wird verwendet, um alle Fehler abzufangen, die während der Ausführung der Promise-Kette auftreten.


javascript— editable

Verwendung des zweiten Arguments von .then()

Alternativ kann ein zweites Argument an .then() übergeben werden, um Fehler zu behandeln, die nach der Ausführung des Callbacks des ersten Arguments auftreten.


javascript— editable

Fortgeschrittene Techniken zur Fehlerbehandlung

Fehlerfluss in Ketten

Fehler sollten korrekt durch die Promise-Kette weitergeleitet werden, um sicherzustellen, dass sie auf der richtigen Ebene behandelt werden. Wenn Sie beispielsweise den .catch()-Block vor dem .then()-Block platzieren, wird der .then()-Block dennoch ausgeführt. Da .catch() die Promise-Kette auflöst (es sei denn, es wirft einen Fehler erneut), erhält das nachfolgende .then() undefined als Argument.

Warnung

Wenn Sie den .catch()-Block vor dem .then()-Block platzieren, wird ein innerhalb des .then() geworfener Fehler nicht vom vorhergehenden .catch() abgefangen. Er wird nur behandelt, wenn Sie danach einen weiteren .catch()-Block hinzufügen.


javascript— editable

Rejection-Weitergabe

Sie müssen nicht nach jedem .then() ein .catch() einfügen. Eine Rejection überspringt alle Erfolgs-Handler (das erste Argument von .then()) und wandert die Kette hinunter, bis sie den ersten .catch() erreicht. So können Sie eine lange Kette von Schritten schreiben und jeden Fehler an einer einzigen Stelle am Ende behandeln.

Im folgenden Beispiel tritt die Rejection ganz am Anfang auf, aber keiner der drei .then()-Callbacks wird ausgeführt — die Kontrolle springt direkt zum einzelnen .catch():


javascript— editable

Erneutes Werfen und Wiederherstellen

Ein .catch()-Handler erfüllt je nach seinem Verhalten zwei Aufgaben:

  • Wiederherstellen — wenn er einen Wert zurückgibt (oder nichts zurückgibt), wird die Kette wieder fulfilled und das nächste .then() wird mit diesem Wert ausgeführt. So stellen Sie einen Fallback-Wert bereit.
  • Erneut werfen — wenn er throw verwendet (oder ein abgelehntes Promise zurückgibt), wird der Fehler weiter zum nächsten .catch() weitergeleitet. Verwenden Sie dies, wenn ein Handler den Fehler nicht vollständig behandeln kann und ein späterer Handler die Arbeit beenden soll.

javascript— editable

Behandlung spezifischer Fehler

JavaScript ermöglicht differenziertere Fehlerbehandlungsstrategien, wie z. B. das Filtern von Fehlern nach ihrem Typ oder den spezifischen Umständen des Fehlers. Im folgenden Beispiel behandeln wir einen TypeError. Ein TypeError tritt typischerweise auf, wenn ein Wert nicht den erwarteten Typ hat und die gewünschte Operation daher nicht durchgeführt werden kann.


javascript— editable

Best Practices für die Promise-Fehlerbehandlung

  1. Fehler immer zurückgeben oder werfen in Catch-Blöcken, um sicherzustellen, dass Fehler nicht stillschweigend ignoriert werden.
  2. Promises korrekt verketten, um sicherzustellen, dass Fehler abgefangen und behandelt werden.
  3. Finally-Blöcke verwenden, wo nötig, um Bereinigungsaufgaben durchzuführen, unabhängig vom Ergebnis des Promise.

Implementierung eines Finally-Blocks

Die finally()-Methode wird verwendet, um einen Codeblock auszuführen, nachdem Promises abgeschlossen sind, unabhängig vom Ergebnis.


javascript— editable

Abfangen von nicht behandelten Rejections

Wenn ein Promise abgelehnt wird und kein .catch() es jemals behandelt, geht der Fehler stillschweigend verloren — es gibt keinen umgebenden try/catch, den synchroner Code hätte. Um zu verhindern, dass Fehler verschwinden, löst die Umgebung ein globales unhandledrejection-Ereignis aus, auf das Sie hören können. Dies ist ein Sicherheitsnetz der letzten Instanz für Protokollierung und Berichterstattung, kein Ersatz für ein echtes .catch().

Im Browser:


javascript— editable

In Node.js ist das Äquivalent process.on('unhandledrejection', (reason) => { ... }).

Fehlerbehandlung mit async/await

async/await basiert auf Promises, daher treten dieselben Rejections auf — aber Sie fangen sie mit einem gewöhnlichen try/catch-Block ab, der wie synchroner Code aussieht. Ein await auf einem abgelehnten Promise wirft innerhalb der async-Funktion, und try/catch fängt es ab. Siehe JavaScript: async/await für das vollständige Bild.


javascript— editable
Info

Ein try/catch innerhalb einer async-Funktion fängt nur Fehler von Promises ab, auf die Sie await anwenden. Wenn Sie eine Promise-zurückgebende Funktion ohne await aufrufen, entgeht ihre Rejection dem try/catch — Sie müssen entweder await darauf anwenden oder ein .catch() anhängen.

Fazit

Eine effektive Fehlerbehandlung bei JavaScript Promises ist unerlässlich für die Entwicklung zuverlässiger und robuster Webanwendungen. Durch das Verstehen der .catch()-Methode, des zweiten Arguments von .then(), der Rejection-Weitergabe, des erneuten Werfens und des .finally()-Bereinigungshooks können Entwickler sicherstellen, dass ihre Anwendungen asynchrone Fehler elegant behandeln und sich erholen, anstatt abzustürzen. Wenn Sie mit async/await arbeiten, umschließen Sie awaited Promise-Aufrufe mit try/catch-Blöcken für synchron anmutende Fehlerbehandlung und behalten Sie einen globalen unhandledrejection-Listener als Sicherheitsnetz für Fälle, die Sie übersehen.

Um tiefer einzutauchen, fahren Sie mit Promises-Verkettung und der Promise-API fort.

Übungen

Übung
Was ist das wichtigste Konzept, das man bei der JavaScript-Fehlerbehandlung mit Promises verstehen muss?
Was ist das wichtigste Konzept, das man bei der JavaScript-Fehlerbehandlung mit Promises verstehen muss?
Was this page helpful?