节点exception处理

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

我试着在我的代码的最上层放一个try / catch,一切都在下面,但是它似乎没有捕获这些exception。 在所有使用任何核心代码的较低级别的函数中使用try / catch是不是很好? 或者有什么方法可以全局捕获所有未处理的exception?

谢谢

克里斯

更新添加堆栈

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) 

有什么方法可以全局捕获所有未处理的exception吗?

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

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

注意文档build议:

请注意,uncaughtException是exception处理的非常粗暴的机制。 在你的程序中使用try / catch可以让你更好地控制程序的stream程。 特别是对于devise为永久运行的服务器程序,uncaughtException可能是一个有用的安全机制。

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

例如

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

我最近在http://snmaynard.com/2012/12/21/node-error-handling/上写了这个。 在0.8版本中,节点的一个新function是域,并允许您将所有forms的error handling组合成一个更简单的pipe理forms。 你可以在我的文章和文档中阅读 。

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

我已经把一个快速的error handling文件放在一起,每当一个未处理的exception抛出时,它就会logging并发送邮件给我。 然后(可选)尝试重新启动服务器。

一探究竟!