使用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
相关产品推荐
相关产品推荐

