Yahoo Finance YFTzMissingError无法被try-except捕获问题排查
问题解决:yfinance无效股票代码未被捕获导致程序继续执行
问题原因
核心问题在于yf.download()遇到无效Ticker时,默认不会主动抛出YFTzMissingError异常,仅在控制台打印错误信息,同时返回空DataFrame。你的try块未检测这个空结果,因此不会触发except分支,程序直接执行break跳出循环。另外,将函数定义放在try块内属于冗余操作,应移至循环外部。
修复方案
方案1:捕获具体异常+验证返回结果
先从yfinance导入对应异常类,同时在获取数据后检查结果是否为空,双重拦截无效Ticker:
import pandas as pd import yfinance as yf from yfinance.exceptions import YFTzMissingError # 函数定义移至循环外,避免重复定义 def closing_price(ticker, start_date, end_date): # 关闭下载进度条,减少冗余输出 data = yf.download(ticker, start=start_date, end=end_date, progress=False) if data.empty: raise ValueError("无效股票代码,无数据返回") return pd.DataFrame(data['Adj Close']) startDate = "2023-01-01" endDate = "2024-01-01" while True: tickerInput = input("请输入要测试的股票代码(不要加引号):") ticker = tickerInput.upper() try: asset = closing_price(ticker, startDate, endDate) asset.head() print("股票代码有效,继续执行后续逻辑") break except (YFTzMissingError, ValueError) as e: print(f"无效股票代码!请重新输入。错误信息:{str(e)}")
方案2:提前验证Ticker合法性
先用yfinance的Ticker对象预验证,避免触发下载错误:
import pandas as pd import yfinance as yf from yfinance.exceptions import YFTzMissingError def closing_price(ticker, start_date, end_date): data = yf.download(ticker, start=start_date, end=end_date, progress=False) return pd.DataFrame(data['Adj Close']) startDate = "2023-01-01" endDate = "2024-01-01" while True: tickerInput = input("请输入要测试的股票代码(不要加引号):") ticker = tickerInput.upper() try: # 预验证Ticker有效性 ticker_obj = yf.Ticker(ticker) if not ticker_obj.info: raise ValueError("无法获取股票代码基本信息") asset = closing_price(ticker, startDate, endDate) if asset.empty: raise ValueError("无历史数据返回") print("股票代码有效,继续执行后续逻辑") break except (YFTzMissingError, ValueError) as e: print(f"无效股票代码!请重新输入。错误信息:{str(e)}")
关键修改点
- 将函数定义移至循环和try块外部,避免重复定义
- 捕获
YFTzMissingError具体异常,同时检查返回的DataFrame是否为空,主动抛出异常触发except分支 - 添加
progress=False关闭下载进度条,简化控制台输出 - 捕获具体异常而非裸except,避免误拦截无关异常
内容的提问来源于stack exchange,提问作者Omega
相关产品推荐
相关产品推荐

