【问题标题】:Exiting the process after uncaughtExceptionuncaughtException 后退出进程
【发布时间】:2019-10-31 16:48:43
【问题描述】:

在我的 NodeJS 应用程序中,每当遇到未处理的异常时,我都希望进程退出。

但是,根据 NodeJS 的文档,它似乎默认退出。 所以我的问题是 - 我的代码中应该有这样的东西吗?

    process
        .on('uncaughtException', (err) => {
            log.error('uncaughtException:', err.message);
            log.error(err.stack);
            process.exit(1);
    });

或者我应该将process.exit(1) 部分排除在外,因为它不需要吗?

【问题讨论】:

  • 不,如果添加此处理程序,则必须以process.exit(1) 结束它,否则您的进程将不会终止(如您所愿)。
  • 顺便说一句,您的整个问题 - 您可以简单地尝试一下,看看会发生什么。
  • 哦,默认情况下 NodeJS 退出,但是如果我添加这个自定义处理程序,它会覆盖默认行为,所以我必须显式退出?
  • 没错。就像我说的那样,您可以轻松地尝试一下(在您的流程某处添加一个故意的异常,看看当您省略 exit 语句时会发生什么。
  • 是的,这是真的.. 感谢您的澄清!如果您愿意,可以将其发布为答案,我会接受!

标签: javascript node.js


【解决方案1】:

process.exit(1) 部分是必需的,默认情况下它不会退出,您的应用程序可能会以意外状态终止,因此您应该将process.exit(1) 放入uncaughtException

但是,将事件 unhandledRejection (如果您在应用中使用 Promises)也是一个很好的做法,以便您更好地了解发生了什么。

process
  .on('unhandledRejection', (reason, p) => {
    console.error(reason, 'Unhandled Rejection at Promise', p);
  })
  .on('uncaughtException', err => {
    console.error(err, 'Uncaught Exception thrown');
    process.exit(1);
  });

此外,作为旁注(达里奥提到并引用官方文档here,请参阅documentation

'uncaughtException' 的正确用法是执行同步 清理分配的资源(例如文件描述符、句柄等) 在关闭进程之前。

【讨论】:

    猜你喜欢
    • 2015-12-12
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多