节点 – 如何通过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作为它的第一个参数,虽然这只是一个约定的问题。