uncaughtException
uncaughtException
当 JavaScript 错误未正确处理时,会触发 uncaughtException 事件,可以通过监听进程的 uncaughtException 事件增加错误处理:
process.on('uncaughtException', (err, origin) => {
fs.writeSync(
process.stderr.fd,
`Caught exception: ${err}\n` +
`Exception origin: ${origin}`,
);
});err包含具体的错误信息,origin区分错误是 uncaughtException 或 unhandledRejection,后者是异步错误。
开发者应该在错误可能发生的位置,通过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时结束进程。
node --unhandled-rejections=strict exe.js在任何Node.js版本中,都可以通过监听 unhandledRejection 来捕获异步错误,且在新版本中,被 unhandledRejection 事件监听器捕获的异步错误,不会再触发 uncaughtException 事件。
process.on('unhandledRejection', err=>{
console.log(err)
})