2012-03-05 73 views
6

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

我试着把一个try/catch放在我的代码的顶层,一切都在下面运行,但它似乎没有捕获到这些异常。在使用任何核心代码的所有较低级别的函数中使用try/catch是否是节点的良好做法?或者有什么方法可以全局捕获所有未处理的异常?

感谢

克里斯

更新,增加了STACK

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

你可以复制一些这些未捕获的异常堆栈的堆栈吗? – seppo0010 2012-03-05 18:23:48

+0

我刚刚添加了堆栈打印出最近的错误之一的主要问题。这让我感到困惑,因为它没有显示我的任何代码。 – 2012-03-06 13:39:31

+0

您使用的是哪个版本的节点?我在问,因为行号与我的本地副本不匹配。 – seppo0010 2012-03-06 14:23:56

回答

4

是有一些方法来全局捕捉所有未处理的异常?

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

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

,请注意文件的建议是:

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

1

为了赶上网络错误,避免你不得不听“错误”事件的默认行为(打印堆栈并退出)。

例如

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

我已经把它记录每当未处理的异常被抛出一个快速的错误处理文件和电子邮件我。然后(可选)尝试重新启动服务器。

Check it out!

1

我在http://snmaynard.com/2012/12/21/node-error-handling/最近写了这件事。版本0.8中的一个新功能是域,并允许您将所有形式的错误处理组合成一个更容易管理的表单。你可以在我的文章和docs中阅读。

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