gpt4 book ai didi

node.js - Node - 如何使用 Node 中的回调处理未捕获的异常?

转载 作者:太空宇宙 更新时间:2023-11-04 01:14:32 31 4
gpt4 key购买 nike

我正在编写一个 Node.js 应用程序。我正在使用 request 和 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);
});

当我这样做时,我收到一条错误消息,指出发送后我无法设置 header 。如果我从进程错误处理中删除回调,我不会看到该错误,但客户端会旋转很长时间,因为我假设我们永远不会调用回调。

我该如何解决这个问题?

另外,我在某处读到,您可以在应用程序级别捕获未捕获的异常,这样您就不必复制代码来在每个方法中捕获它,这可能吗?如果是这样,并且抛出异常的方法预计会回调一些信息,那么如何实现?

谢谢,

最佳答案

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

您的示例代码中存在一些问题。在您的 for 循环中,所有回调都会报告它们正在处理数组中的最后一个 URL,因为它们都引用 i 的相同副本,在其中任何一个执行时,该值将达到最高值。您需要使用辅助函数或立即函数调用来为每个回调提供 i 的私有(private)副本。

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

关于node.js - Node - 如何使用 Node 中的回调处理未捕获的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12009213/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com