如何让try/catch中的循环遇404错误仍继续发起请求不中断?
解决方案
问题核心在于你把整个循环放在了外层try/catch中,只要单个请求抛出错误(比如404这类非2xx状态码,axios默认会将其视为错误),就会直接触发外层catch导致循环终止。要让循环继续执行,需要为每个请求单独处理错误,或者调整axios对错误状态码的判定逻辑。
方式一:每个请求单独捕获错误
把try/catch移到循环内部,这样单个请求的错误只会被当前迭代的catch处理,不会影响后续循环:
let array = []; for (let i = 0; i < postcodes.length; i++) { try { const companyHouseData = await axios.get( `https://api.company-information.service.gov.uk/advanced-search/companies?location=${postcodes[i]}`, { auth } ); // 仅保留2xx范围内的成功响应 if (companyHouseData.status >= 200 && companyHouseData.status < 300) { array.push(companyHouseData); } } catch (err) { // 记录错误信息,也可以针对不同错误做区分处理 console.log(`请求postcode ${postcodes[i]} 失败:`, err.message); if (err.response?.status === 404) { console.log(`postcode ${postcodes[i]} 未找到相关数据`); } } }
方式二:调整axios的错误状态码判定
如果404属于业务上可接受的情况,不想让它触发错误,可以通过validateStatus配置,指定哪些状态码视为“成功响应”:
let array = []; for (let i = 0; i < postcodes.length; i++) { const companyHouseData = await axios.get( `https://api.company-information.service.gov.uk/advanced-search/companies?location=${postcodes[i]}`, { auth, // 让2xx和404都被视为成功响应,不抛出错误 validateStatus: (status) => { return status >= 200 && status < 300 || status === 404; } } ); // 根据状态码决定是否存入数组 if (companyHouseData.status >= 200 && companyHouseData.status < 300) { array.push(companyHouseData); } else if (companyHouseData.status === 404) { console.log(`postcode ${postcodes[i]} 未找到数据`); } }
如果需要处理其他网络错误(比如连接超时、5xx服务器错误),可以在这个基础上再给循环套一层try/catch。
内容的提问来源于stack exchange,提问作者Code Ninja
相关产品推荐
相关产品推荐

