Heim  >  Artikel  >  Web-Frontend  >  So lösen Sie nicht abgefangene Ausnahmen in Node.js

So lösen Sie nicht abgefangene Ausnahmen in Node.js

一个新手
一个新手Original
2017-09-27 10:00:502119Durchsuche


Nicht abgefangene Ausnahmen in Node.js

Der Umgang mit nicht abgefangenen Ausnahmen in Node.js ist nicht einfach

Inhaltsverzeichnis:

  • 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

1. Probleme durch nicht abgefangene Ausnahmen

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.

2. Wie gehe ich mit nicht abgefangenen Ausnahmen um?

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.

3. Eine Anwendung ohne nicht erfasste Ausnahmen

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.

4. Absturz Ihrer Anwendung

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! )

5. Stellen Sie sich vor, Sie sehen den Fehler nicht?

Viele Leute machen das:

<p style="margin-bottom: 7px;">process.on(&#39;uncaughtException&#39;, 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.

6. Die Anwendung stürzt ab, druckt das Protokoll und startet dann neu

Mit dieser Methode können Sie Ihre Anwendung sofort abstürzen lassen, wenn eine nicht erfasste Ausnahme auftritt, und dann forever oder 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/oi/ocluster module7. Verwenden Sie das

-Modul [Anmerkung des Übersetzers: Jetzt veraltet]
var cluster = require(&#39;cluster&#39;);var workers = process.env.WORKERS || require(&#39;os&#39;).cpus().length;if (cluster.isMaster) {
  console.log(&#39;start cluster with %s workers&#39;, workers);  for (var i = 0; i < workers; ++i) {    var worker = cluster.fork().process;
    console.log(&#39;worker %s started.&#39;, worker.pid);
  }
  cluster.on(&#39;exit&#39;, function(worker) {
    console.log(&#39;worker %s died. restart...&#39;, worker.process.pid);
    cluster.fork();
  });
} else {  var http = require(&#39;http&#39;);
  http.createServer(function (req, res) {
    res.end("Look Mum! I&#39;m a server!\n");
  }).listen(3000, "127.0.0.1");
}
process.on(&#39;uncaughtException&#39;, function (err) {
  console.error((new Date).toUTCString() + &#39; uncaughtException:&#39;, err.message)
  console.error(err.stack)
  process.exit(1)
})

Domains ist eine experimentelle Funktion, die in der

-Version hinzugefügt wurde, wodurch die Ausnahmebehandlung erleichtert wird flexibler und präziser. Das Folgende ist ein Beispiel, bei dem die Datei nicht vorhanden ist. Durch die Verwendung von

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(&#39;domain&#39;);var d = domain.create();var fs = require(&#39;fs&#39;);
d.on(&#39;error&#39;, function(err) {
  console.error(err);
});
d.run(function() {
  fs.readFile(&#39;somefile.txt&#39;, function (err, data) {
    if (err) throw err;
    console.log(data);
  });
});

8. 结论

如果你在产品环境运行 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn