从节点中的任何EventEmitter捕获所有`error`事件

时间:2015-03-30 23:24:03

标签: node.js

通过the Node.js documentation,未处理的EventEmitter将导致正在运行的进程崩溃:

  

当EventEmitter实例遇到错误时,典型的操作是发出“错误”事件。错误事件在节点中被视为特殊情况。如果没有侦听器,则默认操作是打印堆栈跟踪并退出程序。

我非常希望在发生这种情况时崩溃的过程。[1]理想情况下,我可以像这样捕获EventEmitter错误的每个实例:

emitter.on('error', function(err) { console.log(err); })

但是我们的应用程序很大,对node_modules文件夹的简单搜索显示有很多EventEmitter,跟踪它们会很麻烦。

我是否可以使用全局钩子来捕获EventEmitter失败的所有实例?

我尝试了process.on('uncaughtException'),但这并没有捕获到EventEmitter错误。我还尝试了process.on('error')来捕获进程发出的错误,但是没有捕获其他EventEmitter发出的错误。

其他地方说你应该使用域名,但是,听起来你需要在其中包含特定的函数调用,此时你也可以找到并用.on('error')包装每个EventEmitter。我的同事还说,如果没有弃用,域名将不会被用于未来。

[1]我理解“进程应该崩溃”背后的逻辑。部分我想让进程保持活动状态,因为a)我们的服务器需要很长时间才能重新启动,而b)进程不断崩溃,实际上是零堆栈跟踪;我认为让进程保持活动状态有助于记录和跟踪错误。

1 个答案:

答案 0 :(得分:6)

process.on('uncaughtException', ...) 捕获EventEmittor错误。试试这个:

'use strict';

setInterval(function () {}, Number.MAX_VALUE); // keep process alive

var myEmitter = new (require('events').EventEmitter)();

// add this handler before emitting any events
process.on('uncaughtException', function (err) {
    console.log('UNCAUGHT EXCEPTION - keeping process alive:', err); // err.message is "foobar"
});

myEmitter.emit('error', new Error('foobar'));

请注意,如果在错误事件被触发后添加了uncaughtException侦听器,则异常不会被抓住!