节点 - 如何使用节点中的回调处理未捕获的异常?

时间:2012-08-17 16:02:31

标签: node.js process

我正在编写节点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);
               });     
           }
      }
}

如果模块抛出未捕获的异常,我该如何处理这种情况? 我尝试添加以下内容:

  process.on('uncaughtException', function (err) {
    console.error(err);
    console.log("Node NOT Exiting...");
    callback(true,null);
  });

当我这样做时,我收到一条错误消息,说我发送后无法设置标头。如果我从进程错误处理中删除回调,我没有看到该错误,但客户端旋转了很长时间,因为我认为我们从不调用回调。

我该如何解决这个问题?

另外,我已经阅读过某些地方,您可以在应用程序级别捕获未捕获的异常,因此您不必复制代码以在每个方法中捕获它,这可能吗?如果是,并且抛出异常的方法预计会回调一些信息,那怎么能实现呢?

谢谢,

1 个答案:

答案 0 :(得分:1)

要回答您提出的问题,使用未捕获的异常处理程序作为一般错误捕获机制通常被认为是糟糕的设计。使用它来处理除了不可恢复的情况之外的任何事情都是错误的经济,你只需要在退出之前进行一些清理。

您的示例代码中存在一些问题。在for循环中,所有回调都会报告他们正在使用数组中的最后一个网址,因为它们都指的是i的同一副本,它将位于其中任何一个执行时的最高值。您需要使用辅助函数或立即函数调用来为每个回调提供i的私有副本。

getDOMTitle中,错误回调应该是callback(error),并且循环中的代码应该包含错误消息中的返回值。成功回调应该使用null作为其第一个参数,尽管这只是一个惯例问题。