当我们在node.js中使用promises时,我们是否需要process.exit(1)

时间:2014-06-10 19:56:15

标签: node.js promise bluebird

在我们公司,我们正在讨论在使用promises时是否需要在node.js中发生未处理异常时退出进程

我脑海里浮现着两种思想流派

  • 当我们在node.js中使用promises时,我们需要使用process.exit(1)

  • 当我们使用promises时,我们不需要使用process.exit(1)

顺便说一句,我们计划将blubird模块用于承诺。

https://www.npmjs.org/package/bluebird

我想知道是否有必要在发生未处理的异常时退出进程,因为在使用promises时我们会获得“finally”语句来清理资源

http://canop.org/blog/?p=516

当涉及到承诺可能无法自行处理的node.js时,我们可以期待哪些类型的错误,如果有的话,我们可能需要通过

来处理
process.on("uncaughtException")
{
process.exit(1);
}

2 个答案:

答案 0 :(得分:5)

简短回答,不。

答案很长:

当您致电process.exit()时,会导致处理停止。将触发exit事件,这是任何代码运行的最后机会,并且事件循环已停止。此后不久,Node.js实际上完全停止并返回指定的退出代码。因此,process.exit()阻止Node.js在该点之后做任何有形的事情并且应用程序停止。

问题

问题在于process.exit()可以随时被应用程序的任何部分调用。没有什么能阻止解析器调用它:

exports.parse = function(text) {

    if (canParse(text)) {
        return doTheParse(text);
    } else {
        console.error("Can't parse the text.");
        process.exit(1);
    }

};

因此,如果可以解析文本,那么它就是,但是否则会向控制台输出错误并调用process.exit(1)。对于低分析器来说,这是一个非常重要的责任。

由于任何模块都可以调用process.exit(),这意味着任何错误的函数调用都可能决定关闭应用程序。这不是一个好的状态。应用程序应该有一个区域决定何时以及是否调用process.exit()以及退出代码应该是什么(通常是应用程序控制器)。公用事业等不应该使用process.exit(),这超出了他们的责任范围。

无论何时您正在考虑使用process.exit(),请考虑抛出错误:

抛出错误与调用process.exit()的效果类似,因为此函数中的代码执行会立即停止。但是,调用函数有机会捕获错误并以优雅的方式响应它。如果调用堆栈没有干预,则会在进程上触发uncaughtException事件。如果没有事件处理程序,那么Node.js将触发exit事件并以非零退出代码退出,就像调用process.exit()时一样;如果有事件处理程序,那么您可以手动调用process.exit()来指定要使用的退出代码。

关键是抛出错误会让应用程序有机会捕获错误并从中恢复,这在处理模块代码时几乎总是理想的情况。

来源:here

答案 1 :(得分:3)

.finally对资源管理不是很好:

  • 可以忘记,只有仔细审核才能找到遗忘的清理工作
  • 在更复杂的情况下,它可以巧妙地泄漏资源

这就是2.0引入using的原因,实际上不可能忘记使用它,因为对资源的承诺实际上是一个只能与using一起使用的处理器。

因此,如果您使用using获取资源,则无需从内部发生的错误重新启动。

请注意,这不包括库中的错误,如果您使用的是泄漏资源的库,则需要重新启动进程。例如,你无法对https://github.com/joyent/node/issues/7697做任何事情(除了fork节点并在核心中使用promises,所以这种事情是不可能的:D)。