Ausnahmebehandlung geworfen, Fehler, innerhalb verspricht

Ich bin mit dem externen code als 3rd-party-Erweiterung zu einer node.js service. Die API-Methoden liefern verspricht. Gelöst Versprechen bedeutet, dass die Aktion erfolgreich durchgeführt wurde, einem gescheiterten Versprechen bedeutet, dass gab es einige problem mit der Durchführung der operation.

Nun, hier ist, wo ich Probleme habe.

Da der 3rd-party-code unbekannt ist, könnte es bugs, Fehler in der syntax, geben Sie Probleme, eine beliebige Anzahl von Dingen, die verursachen könnte node.js eine Ausnahme geworfen werden.

Jedoch, da der gesamte code, der eingewickelt ist in verspricht, diese geworfenen exceptions sind eigentlich wieder als gescheitert verspricht.

Habe ich den Funktionsaufruf in einen try/catch-block, aber es ist noch nie ausgelöst:

//worker process
var mod = require('./3rdparty/module.js');
try {
  mod.run().then(function (data) {
    sendToClient(true, data);
  }, function (err) {
    sendToClient(false, err);
  });
} catch (e) {
  //unrecoverable error inside of module
  //... send signal to restart this worker process ...
});

In dem obigen Pseudo-code Beispiel, wenn ein Fehler geworfen wird, verwandelt es sich bis in die gescheiterten Versprechen der Funktion und nicht in den catch.

Aus, was ich lese, dies ist ein feature, nicht ein Problem, mit dem Versprechen. Aber ich habe Probleme beim wickeln meinem Kopf herum, warum würden Sie wollen immer zur Behandlung von Ausnahmen und erwarteten Ablehnungen genau das gleiche.

Einem Fall ist über den tatsächlichen Fehler im code, möglicherweise unwiederbringlich-das andere ist nur möglich, fehlende Konfiguration Informationen oder parameter, oder etwas wiederhergestellt werden.

Vielen Dank für jede Hilfe!!!

  • Das design ist, dass es keine erwarteten Ablehnungen (ich mag es nicht), die eigentliche Funktion ist, dass Ausnahmen die gemeldet werden, auch wenn geworfen, das in der asynchronen code
  • da der server neu ist viel mehr wünschenswert? wat
  • Wie sonst unbekannten Ausnahmen soll behandelt werden? Ich würde es vorziehen, zu fangen, bekannte Ausnahmen von hand auslösen und die Ablehnung manuell, und verwenden Sie domains/Fenster.onerror - /Prozess.onuncaughtexceptions für alles andere.
  • durch schließen Sie alle geöffneten Ressourcen und meldet einen Fehler an den Benutzer? Haben Sie immer noch zum Absturz des Servers, selbst wenn Sie nicht abgefangene Ausnahme, weil Sie nicht wissen, welche Ressourcen wurden offen gelassen.
  • Das natürlich auch, aber es wird empfohlen, um noch den Prozess starten danach
  • Ja, aber wenn du try-catch-finally-lokal (wie in Versprechen), die Sie nicht haben, um crash-beliebigen server, weil Sie die Handhabung der Fehler lokal genau dort, wo es passiert ist. spion.github.io/posts/why-i-am-switching-to-promises.html
  • Sicher, ich versuche das auch, wo es möglich ist, und ich mag zu verwenden, verspricht für es (manuell). Doch aktuelle Versprechen design nicht zu "werfen weltweit", dieses "immer-local-try-catch" führt zu vergessen done()s etc...
  • Verspricht sollte das gleiche tun wie sync-code, sync code Fehler abzufangen, wenn Sie versuchen-fangen, so was würden Sie tun, mit sync-code?
  • Ich mag es nicht, dass Vergleich. Vielleicht verspricht, kann mächtiger sein, als sync-code? 🙂
  • das wäre nicht mehr mächtig, aber überraschende und zufällige Verhalten, wenn Sie versuchen zu fangen, dann haben Sie versuchen Sie zu fangen. Beachten Sie, dass zum Beispiel mein Versprechen Umsetzung können Sie ganz einfach hören bestimmte Art von Fehlern und die Programmierer Fehler hier ist leicht debugfähiger wenn man sich in der Konsole jsfiddle.net/sU9UN, Aber erwarten wie Diskriminierung auf Fehler-Arten erfolgt auf library-Ebene automatisch würde nicht gut gehen.

Schreibe einen Kommentar