运行CmcScraper遇列表索引越界,如何让循环跳过无效代币?
问题:批量获取加密货币数据时,部分代币导致循环中断,捕获指定异常无效怎么办?
使用CmcScraper批量获取加密货币数据时,部分代币无可用数据会导致循环中断。尝试捕获InvalidCoinCode异常仍无法解决,请问如何让循环在代币数据不可用时继续执行?
原始代码:
import pandas as pd from cryptocmd import CmcScraper coins_list = [] coins = ['VIU', 'UTS', 'UVU', 'TRM'] for i in coins: scraper = CmcScraper(i, start_date="01-01-2017", end_date="01-04-2023") data = scraper.get_data() coins_list.append(data)
尝试过的异常捕获代码(无效):
from cryptocmd.utils import InvalidCoinCode from cryptocmd import CmcScraper coins = ['VIU', 'UTS', 'UVU', 'HNC', 'TRM'] for i in coins: try: scraper = CmcScraper(i, start_date="01-01-2017", end_date="01-04-2023") data = scraper.get_data() print(f"{i} is available through the CoinMarketCap API.") except InvalidCoinCode: print(f"{i} is not available through the CoinMarketCap API.")
解决方案
1. 先排查实际抛出的异常类型
你捕获的InvalidCoinCode可能不是实际触发的异常——比如代币存在但无历史数据、网络错误、API返回格式异常等情况,都会抛出其他类型的异常。先修改代码捕获所有异常并打印类型,定位问题:
from cryptocmd import CmcScraper from cryptocmd.utils import InvalidCoinCode coins = ['VIU', 'UTS', 'UVU', 'HNC', 'TRM'] for coin in coins: try: scraper = CmcScraper(coin, start_date="01-01-2017", end_date="01-04-2023") data = scraper.get_data() print(f"{coin} 数据获取成功") except InvalidCoinCode: print(f"{coin} 无效代币代码,跳过") except Exception as e: # 打印异常类型和详情,方便定位 print(f"{coin} 获取失败:异常类型[{type(e).__name__}],详情:{str(e)}")
运行后就能看到具体是哪种异常导致循环中断,再针对性添加捕获逻辑。
2. 通用解决方案:捕获所有异常确保循环不中断
如果不需要区分异常类型,只希望循环继续执行,可以直接捕获所有Exception(调试或批量处理场景适用):
from cryptocmd import CmcScraper from cryptocmd.utils import InvalidCoinCode coins_list = [] coins = ['VIU', 'UTS', 'UVU', 'HNC', 'TRM'] for coin in coins: try: scraper = CmcScraper(coin, start_date="01-01-2017", end_date="01-04-2023") data = scraper.get_data() print(f"{coin} 数据获取成功") coins_list.append(data) except Exception as e: print(f"{coin} 无法获取数据:{str(e)}") # 可选:添加空值到列表,保持与coins的顺序一致 # coins_list.append(None)
3. 额外检查:确认异常类的导入路径
部分版本的cryptocmd中,InvalidCoinCode的位置可能有变化,比如直接在cryptocmd模块下而非utils。可以查看库的源码确认,若导入错误会导致捕获失效,修改导入语句即可。
内容的提问来源于stack exchange,提问作者dataman
相关产品推荐
相关产品推荐

