【问题标题】:Node Exception Handling节点异常处理
【发布时间】:2013-01-10 08:25:24
【问题描述】:

在 node 中处理来自核心 node 代码的未处理期望的最佳方法是什么?我有一个后台进程,可以运行和抓取 Web 内容,并且可以长时间运行而不会出现问题,但是每隔一段时间就会发生意外异常,我似乎无法优雅地处理它。通常的罪魁祸首似乎是一些网络问题(失去连接),我正在做的 http 调用失败。我创建的所有函数都遵循 FUNCTION_NAME(error, returned_data) 的模式,但是在发生错误的情况下,我没有看到我在打印出来的调用堆栈中创建的任何函数,而是显示一些核心节点模块。我并不真正担心这些不常见的错误及其根本原因,这篇文章的目的只是试图找到一种处理这些异常的优雅方法。

我尝试在我的代码的顶层放置一个 try/catch,一切都在其中运行,但它似乎没有捕获这些异常。在节点中使用任何核心代码的所有低级函数中使用 try/catch 是一种好习惯吗?或者有什么方法可以全局捕获所有未处理的异常?

谢谢

克里斯

已更新以添加堆栈

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: connect Unknown system errno 10060
    at errnoException (net.js:642:11)
    at Object.afterConnect [as oncomplete] (net.js:633:18)

【问题讨论】:

  • 你能复制一些这个未捕获的异常堆栈的堆栈吗?
  • 我刚刚从最近的一个错误中将堆栈打印添加到主要问题中。这让我很困惑,因为它没有显示我的任何代码。
  • 您使用的是哪个版本的节点?我问是因为行号与我的本地副本不匹配。
  • 运行的代码是 0.6.8

标签: node.js exception-handling


【解决方案1】:

有没有办法全局捕获所有未处理的异常?

您可以使用 process.on('uncaughtException') 捕获所有异常。监听此事件将避免打印堆栈和退出的默认操作。但是请注意,忽略异常可能会导致应用执行出现问题。

链接:http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception

注意文档建议:

请注意,uncaughtException 是一种非常粗糙的异常处理机制。在你的程序中使用 try/catch 可以让你更好地控制程序的流程。特别是对于设计为永远运行的服务器程序,uncaughtException 可能是一种有用的安全机制。

【讨论】:

    【解决方案2】:

    要捕获网络错误并避免默认行为(打印堆栈和退出),您必须监听“错误”事件。

    例如

    var net = require('net');
    var client = net.connect(80, 'invalid.host', function () {
        console.log("Worked");
    })
    client.on('error', console.log);
    

    【讨论】:

      【解决方案3】:

      我最近在http://snmaynard.com/2012/12/21/node-error-handling/ 上写了这篇文章。 0.8 版本中节点的一个新特性是域,它允许您将所有形式的错误处理组合成一个更易于管理的形式。您可以在我的帖子和docs 中了解它们。

      您可以使用域在一处处理回调错误参数、错误事件发射器和异常。在这种特定情况下的问题是,当您不处理错误事件发射器时,节点默认情况下会打印堆栈跟踪并退出应用程序。

      【讨论】:

        【解决方案4】:

        我已经整理了一个快速错误处理文件,它会在抛出未处理的异常时记录并通过电子邮件发送给我。然后它(可选)尝试重新启动服务器。

        Check it out!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-14
          • 2021-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多