Wie fängt ein ENOENT mit nodejs child_process.spawn?
Ich bin mit spawn
zum laichen einen lang andauernden Prozess, der sendet die Ausgabe im Laufe der Zeit in stdio und wird bearbeitet und gelesen von meinem nodejs script. Der schwierige Teil ist, dass ich nicht garantieren kann, dass der gesendete Befehl wird immer gültig sein. Wie kann ich fangen einen Fehler in der Laichzeit? Vorzugsweise wird dies nicht mit der Installation eines globalen exception-handler, da ich nicht wollen, behandeln andere Ausnahmen. (Wenn das die einzige Möglichkeit, die ich brauchen würde, um herauszufinden, wenn der erzeugte Prozess hat begonnen, richtig und deinstallieren Sie dann die handler, die ist ein Chaos, ich würde lieber nicht in.)
Den code, den ich ausführen will, wäre so etwas wie dieses:
var spawn = require('child_process').spawn;
try {
spawn("zargle");
} catch (e) {
console.error("I'm handling the error!");
}
Aber das nur erhöht, eine uncaughtException irgendwo in der Knoten-Ereignis-Schleife, vermutlich, weil der Anruf ist async und hat nicht einmal versucht, zu starten, wird der Kind-Prozess auf mein Skript Zeitscheibe.
Die einzigen Ausnahmen, die müssen gefangen werden, wenn spawn nicht starten, der Prozess (zum Beispiel, der name ist falsch und ENOENT geworfen wird). Ich bin nicht (zu diesem Zeitpunkt) befasste sich mit allen Problemen der erzeugte Vorgang kann erzeugen auf Ihrem eigenen.
Ähnlich, aber anders: Wie kann ich debug "Fehler: spawn ENOENT" auf node.js?
Ich weiß genau, warum ich immer bin, ENOENT, und ich weiß, was ich ändern um den Fehler nicht passieren. Meine Frage ist, wie anmutig reagieren auf diese situation, wenn der Irrtum unvermeidbar ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie mit vielen Dingen im Knoten untergeordnete Prozesse, die emittieren kann einen
error
- Ereignis. Fügen Sie einen listener hinzu, und Sie werden in der Lage sein, um es zu fangen (keinetry-catch
erforderlich):error
Veranstaltungen haben immer ein besonderes Ereignis, dass, wenn es keineerror
Ereignis-Listener (und keineuncaughtException
event-handler aufprocess
), wenn es ausgestoßen wird, wird der Fehler geworfen. Es gibt einen eigenen Abschnitt über die Fehler hier in den Knoten docs.Wie mscdex sagte, befestigen Sie die "Fehler" - Ereignis, jedoch sollten Sie versuchen zu fangen da einige Fehler, wie EPERM nicht Feuer das error-Ereignis und throw Error-Ausnahme ausgelöst.
Können Sie versuchen, es zu fangen, mit Prozess uncaughtException Veranstaltung.
Aber ich glaube, rest der Aufgabe wird nicht einfach sein, aber.