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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:06:05