Python调用API触发KeyError:'data'时如何实现自动重试直至成功
问题根因
你现有代码的重试逻辑完全失效,核心问题如下:
- 单次循环内重复发起两次GET请求,两次返回结果可能不一致,额外浪费请求资源
- 状态码异常后没有重新发起请求,一直复用首次请求的返回结果,重试等于空转
- 未捕获KeyError异常,直接访问
webseite['data']只要字段不存在就会直接抛错退出 - 嵌套while逻辑混乱,很容易提前退出或者进入死循环
修正后的实现代码
import requests import time import os def get_nanopool_time_to_next_epoch(): url = "https://api.nanopool.org/v1/eth/network/timetonextepoch" while True: try: # 单次请求,同时处理网络异常、状态码异常、json解析异常 resp = requests.get(url, timeout=10) resp.raise_for_status() # 状态码>=400直接抛异常走重试 webseite = resp.json() # 拿到data就直接返回,否则抛异常走重试 return webseite['data'] except Exception as e: # 打印错误信息,你可以根据需要调整休眠时间 print("--------------------------------------------") print(f"请求失败,错误原因:{str(e)},30秒后重试") time.sleep(30) def programm(): puffer = 420 # 不需要循环里重复赋值 while True: zeit = get_nanopool_time_to_next_epoch() if zeit > puffer: print("Zeit zum DAG-Wechsel in Sekunden:", zeit) time.sleep(30) # 刷新间隔 else: print("Neustart in", int(zeit)) os.startfile("C:/Users/Simon/Desktop/Minerrrestart1.bat") print("restart") time.sleep(10000) # 这里如果跑完bat需要继续监控就把break去掉 break if __name__ == "__main__": while True: programm() break
逻辑说明
- 所有可能出错的环节(网络断连、请求超时、状态码错误、json解析失败、data字段不存在)全部被捕获,触发后自动休眠重试
- 每次重试都会重新发起请求,不会复用之前的失败返回结果
- 只有成功拿到
data字段的值才会返回,确保后续逻辑拿到的一定是有效数据 - 简化了原有的冗余逻辑,避免嵌套死循环
内容的提问来源于stack exchange,提问作者wqeeekendwrrar
相关产品推荐
相关产品推荐

