在我们公司,我们正在讨论在使用promises时是否需要在node.js中发生未处理异常时退出进程
我脑海里浮现着两种思想流派
当我们在node.js中使用promises时,我们需要使用process.exit(1)
当我们使用promises时,我们不需要使用process.exit(1)
顺便说一句,我们计划将blubird模块用于承诺。
https://www.npmjs.org/package/bluebird
我想知道是否有必要在发生未处理的异常时退出进程,因为在使用promises时我们会获得“finally”语句来清理资源
当涉及到承诺可能无法自行处理的node.js时,我们可以期待哪些类型的错误,如果有的话,我们可能需要通过
来处理process.on("uncaughtException")
{
process.exit(1);
}
答案 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)。