Skip to content
导航

uncaughtException

uncaughtException

当 JavaScript 错误未正确处理时,会触发 uncaughtException 事件,可以通过监听进程的 uncaughtException 事件增加错误处理:

js
process.on('uncaughtException', (err, origin) => {
  fs.writeSync(
    process.stderr.fd,
    `Caught exception: ${err}\n` +
    `Exception origin: ${origin}`,
  );
});

err包含具体的错误信息,origin区分错误是 uncaughtExceptionunhandledRejection,后者是异步错误。

开发者应该在错误可能发生的位置,通过try catch等方式进行错误捕获,当错误冒泡到进程的事件循环前仍未捕获,才会触发 uncaughtException 事件。

正确处理未捕获的错误

Node.js 官方建议是,当未捕获的错误发生后,不要尝试恢复进程继续运行,这样运行是不安全的。
正确做法是:记录日志,清理资源如运行时产生的文件,主动退出进程。如需重启,则通过外部监视器来重启进程。

添加 uncaughtException 错误事件监听器后,Node.js不会主动结束进程。此时要主动结束进程。

如果 uncaughtException 错误事件监听器内代码发生未捕获的错误,Node.js会主动结束进程,避免无限递归。

unhandledRejection

当未捕获的异步错误发生,如 Promise.reject() 没有处理,会触发unhandledRejection事件。

在v14及之前的Node.js版本中,unhandledRejection不会触发uncaughtException事件,也不会导致进程退出。

需要给node CLI 加启动参数 --unhandled-rejections=strict 才会按新版本工作:出现unhandledRejection时结束进程。

shell
node --unhandled-rejections=strict exe.js

在任何Node.js版本中,都可以通过监听 unhandledRejection 来捕获异步错误,且在新版本中,被 unhandledRejection 事件监听器捕获的异步错误,不会再触发 uncaughtException 事件。

js
process.on('unhandledRejection', err=>{
  console.log(err)
})

参考资料