下列Node.js异常监听代码能否阻止应用在无try/catch时崩溃?
你给出的Node.js代码如下:
process .on("uncaughtException", (err) => { console.log(err); }) .on("unhandledRejection", (err) => { console.log(err); }) .on("uncaughtExceptionMonitor", (err) => { console.log(err); });
结论
这段代码可以阻止未被捕获的Promise rejection导致的进程崩溃,具体原理如下:
unhandledRejection事件是Node.js专门用于监听未被catch处理的Promise拒绝事件的。默认规则下,Node.js进程遇到未处理的Promise rejection时,会输出错误堆栈后主动终止进程;只要你为该事件注册了监听回调,Node.js就会将错误交给回调处理,不会主动终止进程,你代码里的这部分监听逻辑已经可以覆盖你提到的场景。uncaughtException事件用于监听同步代码抛出的未捕获异常,同样只要注册了监听回调,就会阻止默认的进程退出行为。uncaughtExceptionMonitor仅作为事件监听的钩子,不具备阻止进程退出的能力,它的触发时机早于uncaughtException,一般仅用于错误日志上报等无需干预进程生命周期的场景,如果没有同时注册uncaughtException监听,哪怕注册了这个事件,进程遇到未捕获同步异常时还是会退出。
注意:全局错误监听仅适合作为兜底的错误处理方案,不建议作为常规错误处理逻辑使用。出现未捕获的异常/未处理的Promise rejection时,进程的运行状态往往已经不可预期,继续运行可能引发内存泄漏、逻辑混乱等更严重的问题,生产环境建议捕获到这类错误后,完成日志记录等必要操作后主动退出进程,再配合pm2等进程守护工具实现服务自动重启。
内容的提问来源于stack exchange,提问作者Tejesh
相关产品推荐
相关产品推荐

