La gestion des exceptions non interceptées dans Node.js n'est pas facile
Problèmes causés par des exceptions non interceptées
Comment gérer les exceptions non interceptées
Une application avec aucune exception non détectée
Casser votre application
Faire semblant de ne pas voir l'erreur ?
L'application plante, imprime le journal, puis redémarre
Utiliser le module Domaines [Note du traducteur : désormais obsolète]
Conclusion
En raison de la nature monothread de Node.js, les exceptions non détectées constituent un problème pour le développement d'applications. Problèmes à noter au cours du processus. Node.js suit un modèle de rappel d'erreurs en premier, puis de données. On voit souvent cet exemple : lorsque la fonction de rappel renvoie un objet d'erreur, l'erreur est renvoyée immédiatement.
var fs = require('fs'); fs.readFile('somefile.txt', function (err, data) { if (err) throw err; console.log(data); });
Si vous exécutez ce programme et en supposant que vous n'avez pas le fichier somefile.txt
, une erreur sera générée.
Error: ENOENT, open 'somefile.txt'
Cela entraînera un blocage du processus et affectera l'ensemble de l'application.
Ceci est intentionnel, Node.js n'a pas l'intention de séparer votre application de votre service.
Quelle est la meilleure façon de gérer les exceptions non interceptées ? Il existe des tonnes de façons :
Votre application ne devrait pas avoir d'erreurs non détectées, c'est fou.
C'est aussi fou que vous deviez laisser votre application trouver des exceptions non interceptées après un crash, puis les corriger.
Fermer les yeux sur une erreur et ne pas y faire face, c'est ce que font la plupart des gens, et ça craint.
Vous devez laisser votre application imprimer le journal des erreurs après un crash, puis redémarrer le processus en utilisant quelque chose comme upstart
, forever
, monit
. Cette méthode est très pratique.
[Note du traducteur : désormais obsolète] Vous devriez commencer à utiliser le module Domaines pour gérer les erreurs. C'est la seule voie à suivre, bien qu'il s'agisse encore d'une fonctionnalité expérimentale de Node.js.
Développons maintenant ces méthodes en détail.
Le concept "d'une application sans exceptions non capturées" me semble bizarre, toute application aura des exceptions à un moment donné et il peut s'agir d'une exception non capturée. Si vous insistez sur ce point et envoyez des erreurs aux utilisateurs, alors je pense que vous devriez être prêt à recevoir un appel téléphonique au milieu de la nuit et à être informé que le service est tombé en panne.
La seule défense que je peux trouver dans cet avis est l'argument d'échec rapide. Vous allez réparer votre application rapidement si elle est indisponible s'il s'agit d'une application sans exceptions non détectées. laisser le refus de votre application équivaut à une acceptation. Mais vous imposez toujours la gestion des exceptions à vos utilisateurs (pardonnez-moi de ne pas comprendre comment traduire ce paragraphe. Si vous avez de bonnes idées, veuillez me contacter dès que possible ! )
Beaucoup de gens font cela :
<p style="margin-bottom: 7px;">process.on('uncaughtException', function (err) {<br/> console.log(err);<br/>})<br/></p>
C'est mauvais lorsqu'une exception non interceptée est levée, vous devez réaliser que votre application est dans un état anormal. Dans ce cas, vous ne pouvez pas exécuter votre programme. de manière fiable.
Le Felix Geisendörfer
qui a initialement proposé l'événement process.on propose maintenant de le supprimer.
Avec cette méthode, vous pouvez faire planter votre application immédiatement lorsqu'une exception non interceptée se produit, puis utiliser forever
ou upstart
comme ça L'outil redémarre (presque) instantanément. Node.js écrira l'exception dans STERR
afin que vous puissiez rediriger l'exception vers un fichier journal et en récupérer l'erreur plus tard. L'inconvénient de cette approche est qu'elle ne fournit pas un moyen élégant de gérer les pannes de courant temporaires ou les scénarios de panne de réseau i/o
dans lesquels l'erreur se produit en dehors de votre code. Quel outil ! — Redémarrez l'application et réessayez. Si vous combinez cette stratégie avec i/o
, le nœud peut redémarrer automatiquement tous les enfants qui génèrent une erreur et imprimer l'erreur. cluster module
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
est une fonctionnalité expérimentale ajoutée dans la version Domains
, qui fait que la gestion des exceptions devient plus souple et plus précis. Ce qui suit est un exemple où le fichier n'existe pas. En utilisant Node.js v0.8
, vous pouvez déclencher un événement d'erreur pour un domaine spécifique. Vous pouvez également utiliser une gestion différente des exceptions pour différents scénarios. Cela vous permet de gérer les exceptions en conséquence en fonction de l'endroit où elles se produisent. Si quitter un processus revient à casser une noix avec un marteau, c'est comme un scalpel précis vous donnant un contrôle total sur le programme. 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
为应用提供了一种更聪明的面对异常的能力,异常处理器可能会选择简单的清理、关闭某些连接,最坏的情况下,退出进程。关键点就在于你有了选择。
我抛下榔头拾起手术刀的时候应该已经到了
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!