Node.js最佳实践异常处理

几天前我才开始尝试使用node.js。我意识到只要程序中有未处理的异常,Node就会终止。这与我所见过的普通服务器容器不同,在发生未处理的异常时,只有工作线程会死亡,并且该容器仍将能够接收该请求。这引起了一些问题:

  • process.on('uncaughtException')防范它的唯一有效途径?
  • process.on('uncaughtException')在异步过程执行期间是否还会捕获未处理的异常?
  • 是否存在已经构建的模块(例如发送电子邮件或写入文件),在未捕获的异常的情况下可以利用该模块?

我将不胜感激任何向我展示在node.js中处理未捕获异常的常见最佳实践的指针/文章

樱小卤蛋2020/03/14 12:42:37

如果要在Ubuntu(Upstart)中使用服务:将节点作为服务在Ubuntu 11.04中使用upstart,monit和forever.js。

Jim老丝梅2020/03/14 12:42:37

前一段时间看完这篇文章后,我想知道在api /函数级别使用域进行异常处理是否安全。我想用它们来简化我编写的每个异步函数中的异常处理代码。我担心的是,为每个功能使用新的域会带来大量的开销。我的作业似乎表明,开销最小,在某些情况下,使用域实际上比使用try catch具有更好的性能。

http://www.lighthouselogic.com/#/using-a-new-domain-for-each-async-function-in-node/

L理查德2020/03/14 12:42:37

我只想补充一下,Step.js库通过始终将其传递给下一步函数来帮助您处理异常。因此,您可以在最后一步拥有一个功能,该功能可以检查前面任何步骤中的任何错误。这种方法可以大大简化您的错误处理。

以下是github页面的引文:

捕获所有抛出的异常,并将其作为第一个参数传递给下一个函数。只要您不将回调函数嵌套到主函数中,就可以防止未捕获的异常。这对于长时间运行的node.JS服务器非常重要,因为单个未捕获的异常会导致整个服务器宕机。

此外,您可以使用“步骤”来控制脚本的执行,以将清理部分作为最后一步。例如,如果您想在Node中编写一个构建脚本并报告编写花费了多长时间,那么最后一步可以做到这一点(而不是尝试挖掘出最后一个回调)。

Davaid阳光小卤蛋2020/03/14 12:42:37

我最近在http://snmaynard.com/2012/12/21/node-error-handling/上撰写了有关此内容的文章域0.8版中节点的一项新功能是域,它使您可以将所有错误处理形式组合为一个更易于管理的形式。您可以在我的文章中阅读有关它们的信息。

您还可以使用Bugsnag之类的东西来跟踪未捕获的异常,并通过电子邮件,聊天室收到通知,或者为未捕获的异常创建票证(我是Bugsnag的共同创始人)。

西门十三LEY2020/03/14 12:42:37

您可以捕获未捕获的异常,但是用途有限。参见http://debuggable.com/posts/node-js-dealing-with-uncaught-exceptions:4c933d54-1428-443c-928d-4e1ecbdd56cb

monitforever或者upstart可用于在崩溃时重新启动节点进程。正常关机是您所希望的(例如,将所有内存数据保存在未捕获的异常处理程序中)。