Der Umgang mit nicht abgefangenen Ausnahmen in Node.js ist nicht einfach
Probleme, die durch nicht erfasste Ausnahmen verursacht werden
So gehen Sie mit nicht erfassten Ausnahmen um
Eine Anwendung mit Keine nicht erfassten Ausnahmen
Ihre Anwendung abstürzen lassen
Stellen Sie sich vor, Sie sehen den Fehler nicht?
App stürzt ab, Protokoll drucken, dann neu starten
Domains-Modul verwenden [Anmerkung des Übersetzers: Jetzt veraltet]
Fazit
Aufgrund der Single-Threaded-Natur von Node.js sind nicht abgefangene Ausnahmen ein Problem für die Anwendungsentwicklung Während des Prozesses beachtenswerte Punkte. Node.js folgt einem Rückrufmuster, das zuerst Fehler und dann Daten enthält. Dieses Beispiel sehen wir oft: Wenn die Callback-Funktion ein Fehlerobjekt zurückgibt, wird der Fehler sofort ausgegeben.
var fs = require('fs'); fs.readFile('somefile.txt', function (err, data) { if (err) throw err; console.log(data); });
Wenn Sie dieses Programm ausführen und davon ausgehen, dass Sie die Datei somefile.txt
nicht haben, wird ein Fehler ausgegeben.
Error: ENOENT, open 'somefile.txt'
Dies führt zum Absturz des Prozesses und wirkt sich auf die gesamte APP aus.
Dies ist beabsichtigt. Node.js beabsichtigt nicht, Ihre Anwendung von Ihrem Dienst zu trennen.
Wie gehe ich am besten mit nicht abgefangenen Ausnahmen um? Es gibt unzählige Möglichkeiten:
Ihre App sollte keine nicht erkannten Fehler haben, das ist verrückt.
Es ist auch verrückt, dass Sie Ihre App nach einem Absturz nicht erfasste Ausnahmen finden und diese dann beheben lassen sollten.
Die Augen vor einem Fehler zu verschließen und sich nicht damit auseinanderzusetzen – das ist es, was die meisten Menschen tun, und es ist scheiße.
Sie sollten Ihre Anwendung nach dem Absturz das Fehlerprotokoll ausdrucken lassen und dann den Vorgang mit etwas wie upstart
, forever
, monit
neu starten. Diese Methode ist sehr praktisch.
[Anmerkung des Übersetzers: Jetzt veraltet] Sie sollten beginnen, das Domains-Modul zur Fehlerbehandlung zu verwenden. Dies ist der einzige Weg, obwohl dies noch eine experimentelle Funktion von Node.js ist.
Lassen Sie uns nun diese Methoden im Detail erläutern.
Das Konzept einer „Anwendung ohne nicht erfasste Ausnahmen“ ist für mich seltsam, jede Anwendung wird irgendwann Ausnahmen haben und es kann sein, dass es sich um eine nicht erfasste Ausnahme handelt. Wenn Sie auf diesem Punkt beharren und den Benutzern Fehler vorwerfen, sollten Sie meiner Meinung nach darauf vorbereitet sein, mitten in der Nacht einen Anruf zu erhalten und zu erfahren, dass der Dienst abgestürzt ist.
Die einzige Verteidigung, die ich in dieser Meinung finden kann, ist das Fail-Fast-Argument. Sie werden Ihre Anwendung schnell reparieren, wenn sie nicht verfügbar ist Wenn Sie Ihre Anwendung verweigern, bedeutet das, dass Sie sie akzeptieren. Aber Sie drängen Ihren Benutzern immer noch die Ausnahmebehandlung auf. (Verzeihen Sie mir, dass ich nicht herausfinden kann, wie ich diesen Absatz übersetzen soll. Wenn Sie gute Ideen haben, kontaktieren Sie mich bitte so schnell wie möglich! )
Viele Leute machen das:
<p style="margin-bottom: 7px;">process.on('uncaughtException', function (err) {<br/> console.log(err);<br/>})<br/></p>
Das ist schlecht. Wenn eine nicht abgefangene Ausnahme ausgelöst wird, sollten Sie sich darüber im Klaren sein, dass sich Ihre Anwendung in einem abnormalen Zustand befindet zuverlässig.
Der Felix Geisendörfer
, der die Veranstaltung „process.on“ ursprünglich vorgeschlagen hat, schlägt nun vor, sie zu entfernen.
Mit dieser Methode können Sie Ihre Anwendung sofort abstürzen lassen, wenn eine nicht erfasste Ausnahme auftritt, und dann forever
oder <🎜 verwenden > so Das Tool startet (fast) sofort neu. Node.js schreibt die Ausnahme in upstart
, sodass Sie die Ausnahme in eine Protokolldatei umleiten und den Fehler später daraus abrufen können. Der Nachteil dieses Ansatzes besteht darin, dass er keine elegante Möglichkeit bietet, vorübergehende Stromausfälle oder Netzwerkfehlerszenarien zu bewältigen, bei denen der Fehler außerhalb Ihres Codes auftritt. Was für ein Werkzeug! — Starten Sie die App neu und versuchen Sie es erneut. Wenn Sie diese Strategie mit STERR
kombinieren, kann der Knoten alle untergeordneten Knoten, die einen Fehler auslösen, automatisch neu starten und den Fehler ausdrucken. i/o
i/o
cluster module
7. Verwenden Sie das
var cluster = require('cluster');var workers = process.env.WORKERS || require('os').cpus().length;if (cluster.isMaster) { console.log('start cluster with %s workers', workers); for (var i = 0; i < workers; ++i) { var worker = cluster.fork().process; console.log('worker %s started.', worker.pid); } cluster.on('exit', function(worker) { console.log('worker %s died. restart...', worker.process.pid); cluster.fork(); }); } else { var http = require('http'); http.createServer(function (req, res) { res.end("Look Mum! I'm a server!\n"); }).listen(3000, "127.0.0.1"); } process.on('uncaughtException', function (err) { console.error((new Date).toUTCString() + ' uncaughtException:', err.message) console.error(err.stack) process.exit(1) })
Domains
ist eine experimentelle Funktion, die in der können Sie ein Fehlerereignis für eine bestimmte Domäne auslösen. Sie können auch unterschiedliche Ausnahmebehandlungen für verschiedene Szenarien verwenden. Dadurch können Sie Ausnahmen je nach Ort ihres Auftretens entsprechend behandeln. Wenn das Verlassen eines Prozesses wie das Knacken einer Nuss mit einem Hammer ist, ist dies wie ein präzises Skalpell, das Ihnen die vollständige Kontrolle über das Programm gibt. Domains
var domain = require('domain');var d = domain.create();var fs = require('fs'); d.on('error', function(err) { console.error(err); }); d.run(function() { fs.readFile('somefile.txt', function (err, data) { if (err) throw err; console.log(data); }); });
如果你在产品环境运行 Node.js 你起码应该对如何处理异常有一个想法。目前为止我相信当异常被抛出时,大多数人只是重启应用(也许是优雅地重启),Domains
为应用提供了一种更聪明的面对异常的能力,异常处理器可能会选择简单的清理、关闭某些连接,最坏的情况下,退出进程。关键点就在于你有了选择。
我抛下榔头拾起手术刀的时候应该已经到了
Das obige ist der detaillierte Inhalt vonSo lösen Sie nicht abgefangene Ausnahmen in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!