【问题标题】:How to handle all exceptions in node.js如何处理 node.js 中的所有异常
【发布时间】:2013-11-23 11:08:38
【问题描述】:

在使用 node.js 工作了几周后,我发现 node.js 服务器错误和 PHP 等常规服务器端语言之间存在差异。

一个简单的例子:如果我们的网站出于任何原因发生错误。

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

在 Nodejs 中
如果用户向服务器和 MySQL 发送了一些无效数据,nodejs 服务器会宕机,所有用户都将断开连接,用户之间不再有任何连接。

这是一个非常大的问题。在大型 Web 应用程序中,不可能处理所有错误以避免 Nodejs 服务器停机,问题是,
有没有办法处理任何未知的致命错误和特定输出或类似的异常它。

【问题讨论】:

标签: node.js error-handling


【解决方案1】:

您应该简单地验证路由中的请求数据,捕获任何错误(try-catch 将在这里工作,因为它是一个同步操作)并通过向调用者返回适当的 HTTP 状态(例如 400)来处理它并记录错误。如果您使用 Express,您甚至不必使用 try-catch,因为 Express 会捕获所有同步异常并允许您集中处理它。

我个人不认为使用 process.on('uncaughtException') 捕获验证错误是满足您需求的最佳选择,主要原因有两个:

  • 在此位置,您不知道发生错误的位置,也无法向调用者发回响应
  • 任何类型的未处理错误都会出现在这里,如果您不知道发生了什么类型的错误,建议重新启动该过程。由于输入无效而重新启动进程是没有意义的,例如,这种方式太容易让任何外部调用者 (DDOS) 关闭应用程序

You may read here about other error handling best practices 并具体参考项目符号 4,6 和 10

【讨论】:

    【解决方案2】:

    您可以在流程对象上使用uncaughtException 事件来做您想做的事,但就像其他人所说的那样,建议在正确的级别使用域和捕获/处理错误。

    process.on('uncaughtException', function(err) {
      console.log('Caught exception: ' + err);
    });
    

    【讨论】:

    • 请注意,如果您使用 uncaughtException 事件,您必须退出进程并且不能继续正常运行,因为应用程序处于不一致状态。 nodejs.org/api/…
    • @NickDaugherty 或任何人。是否有任何示例说明未处理的异常如何以某种方式导致应用程序处于不一致或不稳定状态?只是想更好地理解。
    • 示例:您是 HTTP 服务器。一个请求进来,你开始处理它,一个未捕获的异常被抛出。您可以使用上面的代码处理异常,但现在请求超出范围。客户端仍在等待响应,但他们的请求已被清除.... 是吗?谁知道?它是未定义的。如果你正在更新一些内部状态怎么办?你如何从中恢复过来?你不知道。你甚至不知道异常是从哪里来的。你能做的最好的就是记录异常,尽可能干净地退出,然后让程序员弄清楚发生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 2012-05-10
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多