节点 – 如何通过callback节点中处理未捕获的exception?
我正在写一个节点的js应用程序。 我正在使用请求和cheerio来加载一组url,并获得一堆网站的信息,现在让我们假设我想要得到的是标题:
var urls = {"url_1", "url_2", "url_3",...,"url_n"}; for(var i=0; i<urls.length; i++) { getDOMTitle(urls[i],function(error,title){ if(error) console.log("Error while getting title for " + urls[i]); else console.log("The title for " + urls[i] + " is " + title); }); }
这是我的getDOMTitle方法的外观:
function getDOMTitle(urlReq,callback) { var request = require('request'); var cheerio = require('cheerio'); request({url:urlReq},function(error, response, doc){ var $ = cheerio.load(doc); if(error) { callback(true,null); } else { $('title', 'head').each(function (i, elem) { var title = $(this).text(); callback(false,title); }); } } }
在模块抛出未捕获exception的情况下,我该如何处理这种情况? 我曾尝试添加以下内容:
process.on('uncaughtException', function (err) { console.error(err); console.log("Node NOT Exiting..."); callback(true,null); });
当我这样做,我得到一个错误说,我不能设置标题,一旦他们已经发送。 如果我从进程error handling中删除callback,我不会看到这个错误,但客户端会长时间旋转,因为我认为我们永远不会调用callback函数。
我该如何解决这个问题?
另外,我已经在某处读过,可以在应用程序级别捕获未捕获的exception,因此您不必复制代码就可以在每种方法中捕获exception,这是可能的吗? 如果是这样,并且抛出exception的方法有望callback一些信息,那怎么能实现呢?
谢谢,
为了回答你所说的问题,使用未捕获的exception处理程序作为一般的错误捕获机制通常被认为是糟糕的devise。 使用它来处理除了不可恢复的情况之外的任何其他情况,在退出之前只需要进行一些清理就是错误的经济。
你的示例代码中有一些问题。 在for
循环中,所有的callback函数都会报告他们正在处理数组中的最后一个URL,因为它们都指的是i
的同一个副本,这个副本在任何时候都是最高的执行。 您需要使用助手函数或立即函数调用为每个callback提供i
的私有副本。
在getDOMTitle
,错误callback应该是callback(error)
并且循环中的代码应该在错误消息中包含返回的值。 成功的callback应该使用null
作为它的第一个参数,虽然这只是一个约定的问题。