【问题标题】:Nodejs uncaught exception handlingNodejs 未捕获异常处理
【发布时间】:2018-05-07 01:35:32
【问题描述】:

在 nodejs 应用程序中处理未捕获异常的首选方法是什么?

仅供参考,我有一个基于 Express 的 REST Api nodejs 服务器。

【问题讨论】:

  • 你读过 Express 自己的guide on error handling 吗?另外,相关的:Express js error handlingCatch all uncaughtException for Node js appNode.js Best Practice Exception Handling 或者,是否存在您尝试处理错误的特定场景,因为这些错误似乎没有被涵盖?
  • @JonathanLonowski:我已经使用 promise-catch 和 Express 错误处理程序处理了这些错误。但是我担心如果发生一些未处理的异常怎么办,应该如何处理?有人说,使用进程级事件,但有人反对这种处理方式。我很困惑什么是正确/最好的方法。
  • 通常不鼓励使用process 事件来允许进程继续。在停止进程之前使用该事件作为检索和记录附加信息的机会是很好的,但是该进程应该仍然停止(或重新启动)。该信息应该可以帮助您修改应用程序代码的其他区域,因此它要么不会导致异常,要么可以从源头改进对它们的处理。

标签: javascript node.js


【解决方案1】:

很多人都这样做

process.on('uncaughtException', function (err) {
   console.log(err);
});

这很糟糕。当抛出未捕获的异常时,您应该考虑您的应用程序处于不干净状态。此时您无法可靠地继续您的计划。

让您的应用程序崩溃、记录并重新启动。

process.on('uncaughtException', function (err) {
  console.error((new Date).toUTCString() + ' uncaughtException:', err.message);
  console.error(err.stack);
  // Send the error log to your email
  sendMail(err);
  process.exit(1);
})

让您的应用程序在发生未捕获的异常时崩溃,并使用像 forever 或 upstart 这样的工具(几乎)立即重新启动它。您可以发送电子邮件以了解此类事件。

【讨论】:

  • 在崩溃时重新启动它们的工具称为“进程管理器”。我为此使用 PM2
【解决方案2】:

异常应该做以下两件事之一:

  1. 被程序正确捕获和处理
  2. 导致程序在灾难性的愤怒失败中终止

如果您在程序中尝试摆脱未捕获的异常,则您要么需要修复错误,要么需要捕获该异常并正确处理它

复杂的异步代码,通常涉及一堆杂乱无章的未捕获的 Promise,通常是许多未捕获异常问题的原因——您需要非常仔细地观察如何返回您的 Promise 链

唯一永久的解决方案是采用现代 async/await 代码实践来保持异步代码的可维护性

【讨论】:

  • 是的,我同意代码应该首先处理异常。但是如果它仍然未处理并冒泡到进程级别怎么办?
猜你喜欢
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多