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)
})