首页 > 解决方案 > 为什么代码中的 catch 语句没有捕获异步函数中的错误?

问题描述

我在承诺返回中有一个 .then,并且我已经定义了一个从 API 获取一些数据的异步函数。我被卡住的部分是,当我抛出一个错误(强制)时,它不会被 catch 块捕获。

据我所知,一个 .catch 足以满足所有 .then 语句。这是因为代码中有另一个异步函数,因此 .catch 不起作用?

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/abhinav/haikuserver/controllers/campaign.js:263:9) 的 getSuggestedHaiku (/Users/abhinav/haikuserver/controllers/campaign.js:242:23) 处出错。 _tickCallback (internal/process/next_tick.js:68:7) warning.js:18 (node:7646) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。(拒绝 id:2)warning.js:18(节点:7646)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

标签: javascriptnode.jsasync-await

解决方案


Try catch 应该被包裹到 for 循环中。

try{

      for(const campaign of r ){}

}catch() {}

推荐阅读