节点异常处理

节点中处理来自核心节点代码的未处理预期的最佳方法是什么? 我有一个运行和抓取网页内容的后台进程,并且运行很长一段时间没有问题,但每隔一段时间都会发生意外的异常,我似乎无法妥善处理它。 通常的罪魁祸首似乎是一些网络问题(失去连接),我所做的http调用失败。 我创建的所有函数都遵循FUNCTION_NAME的模式(错误,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)

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

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

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

注意文档建议:

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


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

例如

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中的一个新功能是域,并允许您将所有形式的错误处理组合成一个更容易管理的表单。 你可以在我的文章和文档中阅读他们。

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

链接地址: http://www.djcxy.com/p/46453.html

上一篇: Node Exception Handling

下一篇: Simple nodejs http proxy fails with "too many open files"