【问题标题】:Catch all `error` events from any EventEmitter in node从节点中的任何 EventEmitter 中捕获所有 `error` 事件
【发布时间】:2015-03-30 23:24:03
【问题描述】:

通过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'),它会捕获进程发出的错误,但不会捕获其他EventEmitters 发出的错误。

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

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

【问题讨论】:

    标签: node.js


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 2023-03-20
      相关资源
      最近更新 更多