Friedrich Siever

15. Januar 2024

Nest.js - Exception Filters: So behandelst du nicht explizite Ausnahmen in deinem Code

von: Friedrich Siever | Last Updated: 15.01.24

Einführung:

Nest.js bietet einen integrierten Mechanismus, der für die Verarbeitung aller nicht behandelten Ausnahmen in einer Anwendung verantwortlich ist.

Wenn eine Ausnahme nicht explizit im Anwendungscode behandelt wird, wird sie von diesem Mechanismus abgefangen. Dieser Mechanismus kümmert sich automatisch darum, eine entsprechende benutzerfreundliche Antwort zu senden.

Mit anderen Worten hilft Nest.js dabei zu steuern, was passiert, wenn etwas Unerwartetes auftritt.

Einige Beispiele für solche Ausnahmen können sein:

  • Datenbankausfall: Wenn die Verbindung zur Datenbank verloren geht oder die Datenbank nicht erreichbar ist.

  • Nicht übereinstimmende Validierungsregeln: Wenn jemand Daten sendet, die nicht den definierten Validierungsregeln entsprechen. Zum Beispiel ungültige Datenformate oder fehlende erforderliche Felder.

  • Unerwartete Ereignisse: Für alle anderen unerwarteten Fehler, die während der Ausführung auftreten können. Dies könnte situationsabhängig sein, wie z. B. Serverüberlastung, externe API-Ausfälle oder unbekannte Softwarefehler.

Try-Catch

In Situationen, in denen wir in unserem Code mit solchen “Verwerfungen” rechnen, greifen wir normalerweise auf try-catch-Blöcke zurück. Try-Catch-Blöcke ermöglichen es uns, auf spezifische Ausnahmen zu reagieren und entsprechende Maßnahmen zu ergreifen.

Jedoch bietet Nest.js eine elegante Alternative für alle anderen Fälle: Exception-Filters. Diese Mechanismen sind dazu da, alle nicht behandelten Ausnahmen abzufangen.

Exception-Filters

Exception-Filters in Nest.js sind ein leistungsstarker Mechanismus, der automatisch aktiviert wird, wenn eine Ausnahme nicht explizit im Anwendungscode behandelt wird. Sie ermöglichen die Übernahme der Kontrolle und automatische Bereitstellung einer benutzerfreundlichen Antwort.

Mit anderen Worten: Exception-Filters helfen dabei zu steuern, was passiert, wenn etwas Unerwartetes auftritt, und bieten eine klare Trennung zwischen Fehlerbehandlungslogik und Geschäftslogik.

Für alle generischen Exceptions wird automatisch eine Standardantwort erzeugt. Diese besitzt den HTTP-Statuscode 500 und die Beschreibung “Internal Server Error”. Bei den in Nest.js integrierten HTTP-Exceptions können jedoch Code und Nachricht individuell angepasst werden.

Implementierung im Controller

In unserer Beispiel-App werfen wir gemeinsam einen Blick auf die Umsetzung, speziell im Kontext der findOne-Methode.

// ... imports
@Controller("/exhibitions")
export class ExhibitionsController {
  //  ...
  @Get(":id")
  async findOne(@Param("id", ParseIntPipe) id: number) {
    const exhibition = await this.repository.findOneBy({ id });
    if (!exhibition) {
      throw new NotFoundException();
    }
    return exhibition;
  }
}

In diesem Kontext nutzen wir die Exception-Filters bewusst an Stellen, an denen wir erwarten, dass Fehler auftreten können. Die NotFoundException wird beispielsweise bewusst ausgelöst, wenn eine Ressource nicht gefunden wird. Der Exception-Filter erkennt diese bewusst ausgelösten Ausnahmen und generiert entsprechende, benutzerfreundliche Responses.

Das gleiche Konzept gilt natürlich auch für unsere update- und remove-Actions, wenn die Ressource nicht existiert.

Weitere Exceptions

Selbstverständlich ist die NotFoundException nicht die einzige Exception, die auf deinem Weg nützlich sein kann. Weitere wichtige Exceptions, die du in Betracht ziehen solltest, sind beispielsweise:

  • BadRequestException
  • UnauthorizedException
  • ForbiddenException

Für eine umfassende Liste aller in Nest.js implementierten HTTP-Exceptions empfehle ich die Dokumentation zu den eingebauten HTTP-Exceptions. Dort findest du detaillierte Informationen zu jeder Exception und wie sie in verschiedenen Szenarien eingesetzt werden können.

Die Verwendung dieser Exceptions ermöglicht es dir, feingranulare Fehlermeldungen zu generieren und spezifisch auf verschiedene HTTP-Statuscodes zu reagieren.

Solltest du für deinen speziellen Anwendungsfall nicht die passende Exception finden, hast du auch die Möglichkeit, deine eigenen Exceptions zu erstellen. Eine detaillierte Anleitung dazu findest du ebenfalls auf der oben verlinkten Seite etwas weiter unten.

Fazit

Die Exception-Filters in Nest.js stellen einen eleganten Mechanismus für die zentrale Behandlung von nicht behandelten Ausnahmen auf Anwendungsebene bereit. Insbesondere in der asynchronen Natur von Node.js-Anwendungen erweisen sich Exception-Filters als vorteilhaft. Sie ermöglichen es, benutzerdefinierte Logik zur Behandlung von Ausnahmen zu implementieren, ohne den Hauptcode mit try-catch-Blöcken zu überladen.

Die Verwendung von Exception-Filters trägt dazu bei, den Code übersichtlich zu halten und eine klare Trennung zwischen Fehlerbehandlungslogik und Geschäftslogik zu gewährleisten. Diese Funktion ist besonders hilfreich, wenn unerwartete Ausnahmen auftreten und eine einheitliche und benutzerfreundliche Reaktion auf Anwendungsfehler erforderlich ist.

Insgesamt bieten die Exception-Filters eine effektive Möglichkeit, mit Ausnahmen in Nest.js-Anwendungen umzugehen und die Robustheit und Wartbarkeit des Codes zu verbessern. Happy Coding!

0
0 Bewertungen

Jetzt selbst bewerten