节点异常处理
节点中处理来自核心节点代码的未处理预期的最佳方法是什么? 我有一个运行和抓取网页内容的后台进程,并且运行很长一段时间没有问题,但每隔一段时间都会发生意外的异常,我似乎无法妥善处理它。 通常的罪魁祸首似乎是一些网络问题(失去连接),我所做的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下一篇: Simple nodejs http proxy fails with "too many open files"