捕捉来自节点中任何EventEmitter的所有“错误”事件

通过Node.js文档 ,一个未处理的EventEmitter会使正在运行的进程崩溃:

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

在这种情况下,我非常希望这个过程不会崩溃[1]。 理想情况下,我可以捕获EventEmitter错误的每个实例,如下所示:

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

然而,我们的应用程序是很大的,一个简单的searchnode_modules文件夹显示,有很多的EventEmitter,跟踪他们会很麻烦。

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

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

其他地方说,你应该使用域,但是,这听起来像你需要包装特定的函数调用,在这一点上,你可能会发现和包装每个EventEmitter与.on('error') 。 我的同事也说,域名如果不被弃用,不会被用于未来。

[1]我理解“stream程应该崩溃”的论点背后的逻辑。 部分我想保持进程活着,因为a)我们的服务器需要很长的时间来重新启动,和b)进程不断崩溃的字面上零堆栈跟踪; 我认为保持stream程的活力将有助于logging和追踪错误。

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侦听器,则exception不会被捕获!