Node.js未捕获异常处理

3

在Node.js应用程序中处理未捕获异常的首选方式是什么?

顺便提一下,我正在使用基于Express的REST API Node.js服务器。


你有没有阅读过Express自己的错误处理指南?另外,相关的内容还包括:Express js错误处理捕获Node.js应用程序的所有未捕获异常Node.js最佳实践异常处理。或者,你有没有遇到一些特定的场景,这些场景在上述内容中似乎没有涉及到错误处理? - Jonathan Lonowski
@JonathanLonowski:我已经使用promise-catch和Express错误处理程序来处理错误。但是,我担心如果出现一些未处理的异常,应该如何处理?有人说,可以使用进程级别的事件,但也有人不赞成这种处理方式。我很困惑,什么是正确/最佳的处理方式。 - Naveen
通常不鼓励使用process事件来让进程继续运行。可以利用该事件的机会在停止进程之前检索和记录额外信息,但是进程仍然应该停止(或重新启动)。这些信息应该帮助您修改应用程序代码的其他部分,以便要么不引发异常,要么改进异常处理的源头。 - Jonathan Lonowski
2个回答

8

很多人这样做

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的工具来立即重新启动它。您可以发送电子邮件以了解此类事件。


2
重启崩溃的工具被称为“进程管理器”。我正在使用PM2来实现这个功能。 - Константин Ван

0

异常应该做两件事之一:

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

如果你的程序中有未捕获的异常,那么要么你有一个需要修复的错误,要么你需要捕获并正确处理该异常

复杂的异步代码,通常涉及一堆杂乱无章的未捕获的承诺,往往是许多未捕获异常问题的原因 - 你需要非常小心地观察如何返回你的承诺链

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


是的,我同意代码应该在第一时间处理异常。但是如果异常仍然未被处理并向上冒泡到进程级别呢? - Naveen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接