You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Async函数中throw new Error未执行:404时无法终止脚本

问题分析与修复

你的代码存在两个关键问题,导致Web服务器返回404时无法终止脚本:

  1. 未返回Response对象:在fetch的then回调中,你仅做了404状态判断却没有返回response,最终导致dbResponse和yearResponse为undefined。后续执行await dbResponse.text()时会触发新错误,掩盖了之前抛出的404异常。
  2. 未处理Promise拒绝:当then回调抛出错误时,Promise.all会进入拒绝状态,但如果调用readFile时未通过try/catch或.catch()捕获该拒绝,部分环境(如浏览器)仅会在控制台输出警告,不会直接终止脚本。

修复后的代码

async function readFile() {
  let hash = Math.random().toString(36).substr(2, 7);

  const [dbResponse, yearResponse] = await Promise.all([
    fetch("db?" + hash).then((response) => {
      console.log(response.status);
      if (response.status === 404) {
        throw new Error(`资源不存在,状态码:${response.status}`);
      }
      // 必须返回response,后续才能调用text()读取内容
      return response;
    }),
    fetch(cYear + "?" + hash).then((response) => {
      console.log(response.status);
      if (response.status === 404) {
        throw new Error(`资源不存在,状态码:${response.status}`);
      }
      // 必须返回response
      return response;
    }),
  ]);

  const db = await dbResponse.text();
  const yDb = await yearResponse.text();

  return [db, yDb];
}

// 调用readFile时必须处理错误,确保404时终止脚本
(async () => {
  try {
    const [dbData, yearData] = await readFile();
    // 处理正常返回的数据
  } catch (err) {
    console.error(err.message);
    // 主动终止脚本:浏览器环境可重新抛出错误,Node.js可使用process.exit(1)
    throw err;
  }
})();

关键说明

  • 返回Response对象:只有在then回调中返回response,后续才能通过await dbResponse.text()正确读取响应内容。
  • 捕获Promise拒绝:通过try/catch包裹readFile的调用,确保404抛出的错误被捕获处理,同时可主动终止脚本(如重新抛出错误让环境处理,或在Node.js中调用process.exit(1))。

内容的提问来源于stack exchange,提问作者Hezi-Gangina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:56:10