如何正确使用 uncaughtException ?
发布于 6 年前 作者 NiLinli 4937 次预览 最后一次回复是 2 年前 来自 问答
最近在看狼书里面提到捕获 uncaughtException 异常防止 process 退出。 看了一下 Node 文档, 提到
需要注意,如果打算使用 ‘uncaughtException’ 事件作为异常处理的最后补救机制,这是非常粗糙的设计方式
感觉对 uncaughtException 使用场景很迷茫,麻烦指点一下。
4 回复
最近在看狼书里面提到捕获 uncaughtException 异常防止 process 退出。 看了一下 Node 文档, 提到
需要注意,如果打算使用 ‘uncaughtException’ 事件作为异常处理的最后补救机制,这是非常粗糙的设计方式
感觉对 uncaughtException 使用场景很迷茫,麻烦指点一下。
文档里面也描述了,使用 uncaughtException 的正确方式就是在它的回调里面做一些同步的资源释放和错误记录工作,但是不能在里面进行程序的错误恢复,因为此时的程序运行状态是不可预测的,如果有恢复程序的需求,应该在守护进程中完成,类似常用的 pm2
确实是为了防止进程退出的,我一般uncaughtException和unhandledRejection都只是收集错误,因为这相当于是保证程序继续运行最后的手段,所以必需让这两个事件极少发生,甚至是绝不发生 uncaughtException最常见的就是 TypeError: Cannot read property ‘prop’ of null ,就是访问对象的属性前没检查对象是否为null或undefined unhandledRejection就是promise对象没有catch
并不是说这两个事件发生了就一定要关闭资源退出,曾经公司的另一个项目(其它同事负责)出现过一次生产事故,因为某开源模块也监听了这两个事件并且居然强行process.exit(),导致服务进程无限重启,实际上并没有什么影响(欢迎大佬提供典型案例指正)
@zengming00 最有个项目的代码报 uncaughtException,然后进程退出 并被 pm2 重启,影响了正在进行的业务; 由于已经加了 process.on(‘uncaughtException’) 的处理,还以为是是内存泄露被系统 kill,查了半天也没找到原因; 看了你这段话,我查了下 ‘node_module’ 中的代码,发现是第三方模块 sentry 默认的 uncaughtException 处理会退出进程。
万分感谢,一语点醒~