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

2024-01-18

Via Node.js 文档 https://nodejs.org/api/events.html, 未处理的EventEmitter将使正在运行的进程崩溃:

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

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

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

然而我们的应用程序很大,简单搜索一下node_modules文件夹显示有很多 EventEmitters,追踪它们会很麻烦。

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

I tried process.on('uncaughtException')但这并不能捕获 EventEmitter 错误。我也尝试过process.on('error')它捕获该进程发出的错误,但不捕获其他进程发出的错误EventEmitters.

其他地方说你应该使用域,但是,听起来你需要在其中包装特定的函数调用,此时你不妨找到并包装每个 EventEmitter.on('error')。我的同事还表示,如果不弃用域名,以后就不会再使用。

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


process.on('uncaughtException', ...) does捕获 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 监听器after您的错误事件已触发,异常不会被捕获!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捕获来自节点中任何 EventEmitter 的所有“错误”事件 的相关文章

随机推荐