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

使用yahoo-finance异步获取股票数据时无法捕获错误

解决yahoo-finance无效股票代码的错误捕获问题

你遇到的问题是因为yahoo-finance.historical方法对于不存在的股票代码,并没有触发Promise的reject,所以try/catch块不会执行。这类情况下,它可能只是返回空数据,或者在内部逻辑里打印错误但不向外抛出。

解决思路很直接:

  • 先检查请求返回的数据是否符合预期(比如是否为空数组)
  • 如果数据异常,手动抛出错误,让catch块能捕获到
  • 同时注意你的日期参数写法错误,2020-08-23会被JS解析成数字运算(结果是1989),必须改成字符串或者Date对象

修改后的代码示例:

const yahooFinance = require('yahoo-finance');

async function stockData(symbol) {
  try {
    // 修正日期参数为字符串格式
    let data = await yahooFinance.historical({
      symbol: symbol,
      from: "2020-08-23",
      to: "2021-08-23"
    });
    
    // 检查返回数据是否为空(无效代码通常返回空数组)
    if (!data || data.length === 0) {
      throw new Error(`无效的股票代码:${symbol}`);
    }
    
    // 数据正常时的处理逻辑
    console.log(`获取到${symbol}的股票数据:`, data);
    return data;
  } catch (error) {
    console.error(error.message);
    // 抛出错误方便循环里判断是否执行后续逻辑
    throw error;
  }
}

// 循环调用示例
async function batchStockData(symbols) {
  for (const symbol of symbols) {
    try {
      await stockData(symbol);
      // 数据获取成功,执行后续函数
      // doSomethingAfterSuccess();
    } catch (error) {
      // 捕获到错误,跳过当前代码的后续逻辑
      console.log(`跳过${symbol}的后续处理`);
      continue;
    }
  }
}

// 测试
batchStockData(["AAPL", "SIJGAOWSFA", "MSFT"]);

关键说明:

  • 手动判断返回数据是否为空,主动抛出错误,让catch块能捕获
  • 日期参数必须是字符串或Date,否则会被解析成数字,导致请求日期错误
  • 在循环里调用时,每个请求单独用try/catch包裹,这样单个错误不会中断整个循环,也能灵活控制是否执行后续函数

内容的提问来源于stack exchange,提问作者srb633

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:06:26