Node.js:当存在子进程时处理未捕获的异常

时间:2014-11-03 09:10:24

标签: node.js

似乎普遍接受的良好做法是节点进程在遇到未处理的异常时应重新启动。 (例如see this)

但是,应用程序何时由父进程和子进程组成(例如,使用child_process.fork())。在这种情况下,我们无法重新启动子进程。所以我的问题是:

处理节点进程中未被捕获的错误的最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

我认为这里没有通用答案 - 这取决于每个流程的目的,它们是您编写和维护的节点应用程序等等。

如果你说你的应用程序本身包含2个进程,我将其称为你编写的两个节点应用程序,那么我认为应该将子进程的意外不洁退出视为主要的未捕获异常处理。记录它,然后退出父进程并让主管重新启动父进程(然后将重新启动子进程)。

我的回答会有所不同,例如,如果子进程是graphicmagick来调整图像大小。然后,子进程崩溃对父进程的稳定性没有任何特殊影响,可以记录错误但允许父进程继续运行。

如果子进程只是使用节点核心集群模块的工作者集群之一,那么不,工作程序崩溃不需要主集群管理器退出并重新启动。

我认为绝大多数长期运行的节点应用程序都不适合您描述的模型,因此我不认为社区 是最佳实践。常见的情况是:单个流程,具有外部/辅助帮助程序的单个流程,以及主/工作集群。

答案 1 :(得分:1)

处理未捕获的例外的最佳做法是the same for a child process as a parent (http://nodejs.org/api/process.html#process_event_uncaughtexception), from the docs:

  

请注意,uncaughtException是一种非常粗略的异常机制   处理,将来可能会被删除。

     

不要使用它,而是使用域名。如果你使用它,重启你的   每次未处理的异常后申请!

     

未处理的异常意味着您的申请 - 以及扩展   node.js本身 - 处于未定义状态。盲目恢复意味着   任何事情都可能发生。

     

在升级时考虑恢复拔电源线   你的系统。十分之九没有任何事情发生 - 但是第十次   时间,你的系统破灭了。

     

你被警告了。

所以似乎重启这个过程是最好的