如何在node.js中处理所有异常

36

在使用node.js工作几周后,我发现node.js服务器错误与像PHP这样的普通服务器端语言之间存在差异。

举个简单的例子:如果网站因任何原因出现错误。

在PHP中
如果用户向服务器和MySQL发送一些无效数据,MySQL将向该特定用户输出错误,并且整个应用程序不会崩溃。

在Nodejs中
如果用户向服务器和MySQL发送一些无效数据,则nodejs服务器将崩溃,因此所有用户都将断开连接,而用户之间将不再有连接。

这是一个非常大的问题。在大型Web应用程序中,要避免Nodejs服务器崩溃处理所有错误是不可能的,问题是:
是否有任何方式可以处理任何未知的致命错误和异常,使其输出到特定位置或类似的东西。


4
使用 Node 的 domain 支持进行集中式错误处理。 - JohnnyHK
1
@JohnnyHK 特别是这一段 警告:不要忽略错误! 详细说明了为什么进程需要被杀死以及如何处理此问题。 - maxdec
1
域已被弃用 https://nodejs.org/api/domain.html - saille
3个回答

64
您可以使用进程对象上的uncaughtException事件来实现自己想要的功能,但是像其他人所说的那样,推荐使用域和在正确的级别捕获/处理错误。
process.on('uncaughtException', function(err) {
  console.log('Caught exception: ' + err);
});

20
请注意,如果您使用uncaughtException事件,必须退出进程并停止正常操作,因为应用程序处于不一致状态。 请参考链接:https://nodejs.org/api/process.html#process_warning_using_uncaughtexception_correctly - Nick Daugherty
@NickDaugherty 或其他任何人。有没有关于未处理异常如何导致应用程序处于不一致或不稳定状态的示例?只是想更好地理解。 - RayLoveless
2
你是一个HTTP服务器。一个请求进来了,你开始处理它,但是出现了未捕获的异常。你可以使用上面的代码来处理异常,但此时请求已经超出了范围。客户端仍在等待响应,但他们的请求可能已被清除……或者没有?谁知道呢?这是未定义的。如果你正在更新一些内部状态,而此时出现了异常,该怎么办?你不知道。你甚至不知道异常来自哪里。你能做的最好的事情就是记录异常,尽可能干净地退出,并让程序员弄清楚发生了什么。 - musicin3d

5
你应该在路由中简单验证请求数据,捕获任何错误(因为是同步操作,所以try-catch会起作用),并通过返回适当的HTTP状态(例如400)给调用者处理错误和记录错误。如果你使用Express,甚至不需要使用try-catch,因为Express将捕获所有同步异常,并允许你集中处理它。
我个人认为,在process.on('uncaughtException')中捕获验证错误不是最好的选择,有两个主要原因:
  • 在这个位置,你没有上下文知道错误发生的地方,无法向调用者发送响应
  • 任何类型的未处理错误都会到达这里,如果你不知道发生了什么类型的错误,建议重启进程。因为无效的输入而重启进程没有意义,例如这样很容易让外部调用者使应用程序崩溃(DDOS)
您可以在此处阅读其他错误处理最佳实践,特别是参考第4、6和10点。

0

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