Erneutes Auslösen der Ausnahme in NodeJS und nicht Verlust der Stack-Trace

10

Wie kann ich einen Fehler oder eine Ausnahme in nodejs / javascript erneut auslösen und eine benutzerdefinierte Nachricht einfügen.

Ich habe den folgenden Code

%Vor%

und ich wollte den Inhalt result in die Ausnahmebedingungsnachricht einfügen, falls ein Parsing-Fehler auftritt. So etwas.

%Vor%

Das Problem hier ist, dass ich meinen Stack-Trace verliere.

Gibt es eine Möglichkeit, es ähnlich wie java zu machen?

%Vor%     
alayor 12.03.2017, 23:06
quelle

3 Antworten

10

Ich kenne keine native Methode wie Java und habe noch keine elegante Lösung für Wrapping-Fehler gefunden.

Das Problem bei der Erstellung von new Error ist, dass Sie Metadaten verlieren können, die an die ursprüngliche Error angehängt wurden, die geworfen wurde, wobei der Stack und der Typ im Allgemeinen das ist, was zurückgelassen wurde.

Änderungen am bestehenden Fehler sind schneller, aber es ist immer noch möglich, Daten aus dem existenten Fehler zu modifizieren. Es fühlt sich auch falsch an, in einem Fehler herumzustochern, der irgendwo anders erstellt wurde.

Erstelle einen neuen Fehler und einen neuen Stapel

Die Eigenschaft .stack eines neuen Error kann geändert werden, um zu sagen, was Sie möchten, bevor es geworfen wird. Das vollständige Ersetzen einer Fehler stack -Eigenschaft kann jedoch für das Debugging sehr verwirrend werden.

Wenn sich der ursprüngliche geworfene Fehler und der Fehlerhandler an verschiedenen Speicherorten oder Dateien befinden, können Sie möglicherweise die Quelle des ursprünglichen Fehlers verfolgen, aber nicht den Handler verfolgen, bei dem der Fehler tatsächlich abgefangen wurde. Um dies zu vermeiden, sollten einige Referenzen auf die beiden Fehler in stack beibehalten werden. Es ist auch nützlich, Zugriff auf den vollständigen ursprünglichen Fehler zu haben, wenn zusätzliche Metadaten darin gespeichert sind.

Hier ist ein Beispiel, wie Sie einen Fehler abfangen, in einen neuen Fehler einfügen, aber das ursprüngliche stack hinzufügen und das error speichern:

%Vor%

Welche wirft:

%Vor%

Wir haben also ein neues generisches Error erstellt. Leider wird die Art des ursprünglichen Fehlers von der Ausgabe ausgeblendet, aber die error wurde als .original angehängt, so dass immer noch darauf zugegriffen werden kann. Das neue stack wurde weitgehend entfernt, mit Ausnahme der generierenden Zeile, die wichtig ist, und der ursprünglichen Fehler stack angehängt.

Alle Tools, die versuchen, Stack-Traces zu parsen, funktionieren möglicherweise nicht mit dieser Änderung oder im besten Fall, sie erkennen zwei Fehler.

ES2015 Fehlerklassen

Dies wird zu einer wiederverwendbaren ES2015 + Fehlerklasse ...

gemacht %Vor%

Ergebnisse in

%Vor%

Dann wissen Sie, dass immer, wenn Sie RethrownError sehen, der ursprüngliche Fehler weiterhin bei .original verfügbar ist.

Diese Methode ist nicht perfekt, aber es bedeutet, dass ich bekannte Fehler von zugrunde liegenden Modulen in generische Typen eingeben kann, die einfacher zu handhaben sind, normalerweise mit Bluebirds gefiltert catch .catch(TypeError, handler)

Derselbe Fehler mit einem modifizierten Stapel

Manchmal müssen Sie den ursprünglichen Fehler größtenteils unverändert lassen.

In diesem Fall können Sie einfach die neue Information an den bestehenden Stapel anhängen / einfügen.

%Vor%

Was zurückgibt

%Vor%

Beachten Sie auch, dass die Stapelverarbeitung einfach ist und davon ausgeht, dass die Fehlermeldung eine einzelne Zeile ist. Wenn Sie auf mehrzeilige Fehlermeldungen stoßen, müssen Sie möglicherweise nach \n at suchen, um die Nachricht zu beenden.

    
Matt 13.03.2017, 02:43
quelle
3

Wenn Sie nur die Nachricht ändern möchten, können Sie einfach die Nachricht ändern:

%Vor%
    
ShadSterling 20.09.2017 14:35
quelle
2

Sie können auch weiterhin den Fehler in Ihrer Versuchskette auslösen. Wenn Sie etwas ändern wollen, tun Sie dies auf dem Weg: vor der throw-Anweisung in b.

%Vor% %Vor%
    
Michael McLaughlin 20.09.2017 15:03
quelle