提问者:小点点

为什么代码内部的catch语句没有捕捉到异步函数中的错误?


我在promise返回中有一个 .then,并且定义了一个从 API 获取一些数据的异步函数。我陷入困境的部分是,当我(强行)抛出错误时,它不会被捕获块捕获。

据我所知,单身。对所有人来说,捕到的已经足够了。然后陈述。这是因为代码中有另一个异步函数,因此。接球不灵了?

CampaignController.getOnboardingCampaignList = (req,res) => {

    return OnBoardingCampaign.find({description : {$exists : true}},{name: 1, description : 1, suggestedHaikuIds : 1})
    .then((r) => {
      // Some Logic here, unrelated the the work done below

        async function getSuggestedHaiku(){
            for(const campaign of r ){
                let suggestedHaikuIds = [];
                campaign.suggestedHaikus = [];
                throw new Error; // Using this to throw the new error
                if(campaign.suggestedHaikuIds === '') campaign.suggestedHaikuIds = [];
                else{
                    campaign.suggestedHaikuIds.forEach((id) => {
                        suggestedHaikuIds.push(Helper.parseId(id))
                    }) // This particular line threw the error initially
                    const result = await SuggestedHaiku.find({_id: {$in : suggestedHaikuIds}},{timeStamp : 0, deleted : 0, returnCount : 0, writtenCount : 0});

                    campaign.suggestedHaikus = result;
                }

            }

            if(r.length === 0){
                return Promise.reject(1001);
            }else{
                let result = {};
                result.list = r;
                Helper.success(res,"Onboarding Campaign List",result);
            }
        }
        getSuggestedHaiku();    


    })
    .catch(err => Helper.error(res, err)) // This catch did not catch the error thrown above

}

错误消息如下

UnhandledPromiseRejectionWarning:onboardingcampaign . find . then(/Users/abhi nav/haiku server/controllers/campaign . js:263:9)处的getSuggestedHaiku处出错。_ tick callback(internal/process/next _ tick . js:68:7)warning . js:18(node:7646)UnhandledPromiseRejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数内部,或者拒绝未用处理的promise。catch()。(拒绝id:2)warning . js:18(node:7646)[dep 0018]deprecation warning:不赞成使用未处理的promise拒绝。将来,未被处理的promise拒绝将使用非零退出代码终止Node.js进程。


共2个答案

匿名用户

尝试捕获应包装到 for 循环。

try{

      for(const campaign of r ){}

}catch() {}

匿名用户

Javascript执行命令时不一定要等待前面的函数/命令完成。当您的异步函数完成并抛出错误时,控制流已经领先于catch块。

因此,当发生错误/promise拒绝时,事件循环中没有剩余的捕获块来处理它。