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.
Das Problem hier ist, dass ich meinen Stack-Trace verliere.
Gibt es eine Möglichkeit, es ähnlich wie java
zu machen?
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.
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:
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.
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)
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.
Wenn Sie nur die Nachricht ändern möchten, können Sie einfach die Nachricht ändern:
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.
Tags und Links javascript exception-handling node.js expect.js