2017-03-23 1 views
1

Wie kann ich in einem .catch() den Wert finden, der den Fehler verursacht hat?In RxJS, wie können Sie den Wert erhalten, der einen Fehler verursachte?

Zum Beispiel können sagen, dass Sie Code wie dieses:

Rx.Observable.of(42) 
.map((val) => { 
    throw new Error('oops!'); 
}) 
.catch((err) => { 
    // how can I get `42` here? 
}); 

Wie können Sie wissen, was den Fehler verursacht endete?

Für Bonuspunkte, ist dies möglicherweise in .finally()?

+0

Was den Wert werfen? –

Antwort

2

Wenn Sie den Wert möchten, übergeben Sie es in Ihrer Ausnahme.

Rx.Observable.of(42) 
.map((val) => { 
    throw new AppError({message : 'oops!', contextInfo : {someName: 42}}); 
}) 
.catch((err) => { 
    // get it from the `err` object 
}); 

Dies erfordert, dass Sie Ihre eigene Art von Fehlern (AppError) implementieren, die von den nativen Error erbt. Diese Technik ist nicht spezifisch für Rxjs, kann aber überall angewendet werden. Error ist ein Objekt, zu dem Sie jedes beliebige Feld hinzufügen können, das durch Vererbung als passend betrachtet wird. Es ist eine gute Vorgehensweise, Fehler zu haben, die relevante Informationen über die Wann (Verfolgung)/Wo (Schuldzuweisung)/Warum (Diagnose) Aspekte des Fehlers enthalten.

Informationen zum Erstellen eines eigenen Fehlers finden Sie unter .

finally Der Operator verwendet eine Auswahlfunktion, die keine Argumente annimmt. Wenn dies in finally möglich ist, wird dies nicht durch Parameterübergabe erfolgen. Du könntest es immer noch durch die Schließung schaffen, aber das ist weit entfernt von etwas, das ich empfehlen würde.

UPDATE Mit Bezug auf How can you know what ended up causing the error?, im allgemeinen Fall kann man nicht. Genau wie bei Versprechungen werden Fehler bis zu dem Punkt verbreitet, an dem sie gefangen werden, oder sie enden damit, aus dem Versprechen/beobachtbaren Kontext heraus zu sprudeln. So sind die üblichen Techniken anwenden, die fail fast Technik, um die produktivsten sein:

  • scheitern schnell: ein Typ-System verwenden (der eigenen, indem Sie Ihre Sprache zur Verfügung gestellt oder sonst) - auf diese Weise wird sichergestellt, Sie Sie nur Werte verarbeiten von der erwartete Typ, so dass Sie diese Arten von Fehlern beseitigen können. Ich experimentierte mit a babel plugin for contracts und ich fand es ziemlich brauchbar, wenn Sie bereits babel verwenden.
  • scheitern schnell: fangen Fehler so früh wie Sie können, je weiter Sie von der Quelle der Fehler sind, desto schwieriger ist es zu untersuchen.
  • fail fast: Verwenden Sie Bibliotheken, die eine gute Fehlerberichterstattung über diejenigen haben, die dies nicht tun (stilles Verschlucken von Fehlern ist hier Ihr Feind). Eine gute Bibliothek bietet zu diesem Zweck einen Konfigurationsparameter.
  • überprüfen Sie die Stack-Trace (mit rxjs 5, ist es einfacher geworden, dies zu tun, aber immer noch über die Interna wissen müssen)
  • hinzufügen zu Code Tracing/Protokollinformationen usw.
+0

Dies hilft nicht in Situationen, in denen der Fehler nicht von Ihnen erstellt wurde. Ich suche nach einer allgemeinen Lösung, damit ich sicherstellen kann, dass Referenzen, die für dieses Objekt spezifisch sind, bereinigt werden, wenn das Objekt irgendeine Art von Fehler aufweist. – JBCP

+2

Dann sollten Sie ein realistischeres Beispiel geben, damit Sie den allgemeinen Fall, den Sie behandeln, verstehen können. Das heißt, selbst wenn der Fehler nicht von Ihnen erstellt wurde, vorausgesetzt, es hat den Typ "Error", können Sie ihn trotzdem erfassen und mit Ihren lokalen Daten erweitern und ihn erneut ausführen, wenn dies Ihr Anwendungsfall ist.In jedem Fall muss Ihre Bereinigung in der 'catch'-Klausel erfolgen, in der 'finally'-Klausel kann sie nicht vorkommen. Können Sie ein besseres Beispiel veröffentlichen? – user3743222

Verwandte Themen