节点异常处理

时间:2012-03-05 18:21:54

标签: node.js exception-handling

节点处理来自核心节点代码的未处理预期的最佳方法是什么?我有一个运行和抓取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)

4 个答案:

答案 0 :(得分:4)

  

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

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

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

注意文档建议:

  

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

答案 1 :(得分:1)

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

例如

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

答案 2 :(得分:1)

我最近在http://snmaynard.com/2012/12/21/node-error-handling/写了这篇文章。版本0.8中的节点的新功能是域,允许您将所有形式的错误处理组合到一个更简单的管理表单中。您可以在我的帖子和docs中阅读有关它们的信息。

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

答案 3 :(得分:0)

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

Check it out!