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

Python请求偶发返回空JSON响应导致脚本运行失败如何解决

问题根因

原代码存在多类逻辑、语法错误,直接导致空响应绕过重试逻辑:

  • 校验逻辑漏洞:当接口返回空字典{}时,遍历字典键的for key in jsonData循环不会执行,jsonkey变量不会被赋值为本次响应的内容,要么沿用上一次循环的旧值,要么直接触发未定义变量报错,根本无法识别空响应
  • 重试计数写法错误:r =+ 1是将r赋值为正1,不是自增,会导致重试循环逻辑完全失效
  • 无重试兜底:重试次数耗尽后没有终止逻辑,代码会强制往下执行取值操作
  • 缩进错误:外层while i < 1000下的代码块没有正确缩进,实际运行会直接触发语法错误
  • 异常覆盖不全:没有考虑JSON解析失败、请求超时等其他偶发异常场景
修复方案

直接替换为以下代码即可:

import time

i = 0
# 可根据实际需求调整参数
MAX_RETRY_TIMES = 4
RETRY_SLEEP_SEC = 5
TARGET_SYMBOL = "NVCR"

while i < 1000:
    valid_resp = None
    # 重试逻辑
    for retry_cnt in range(MAX_RETRY_TIMES):
        time.sleep(RETRY_SLEEP_SEC)
        try:
            resp = c.get_quote(TARGET_SYMBOL)
            resp_json = resp.json()
            # 直接校验响应结构是否符合预期,空字典会直接判定为无效
            if TARGET_SYMBOL in resp_json and "lastPrice" in resp_json[TARGET_SYMBOL]:
                valid_resp = resp_json
                print(i)
                print("请求成功,响应:", resp)
                print(resp_json)
                print()
                break
            # 响应无效打印日志
            print(f"响应无效,第{retry_cnt+1}次重试,返回内容:{resp_json}")
        except Exception as err:
            print(f"请求异常,第{retry_cnt+1}次重试,错误信息:{str(err)}")
    # 重试全部失败直接抛出明确错误,避免后续无意义报错
    if not valid_resp:
        raise RuntimeError(f"连续{MAX_RETRY_TIMES}次请求{TARGET_SYMBOL}行情失败")
    # 校验通过再取值
    current_price = valid_resp[TARGET_SYMBOL]["lastPrice"]
    i += 1
关键改动说明
  • 废弃原来遍历字典取key的判断逻辑,直接通过成员运算符判断标的键是否存在,空字典{}会100%被识别为无效响应进入重试,不存在绕过可能
  • 用for range实现重试计数,替换原来错误的r =+ 1写法,从根源避免计数逻辑错误
  • 增加try/except块,覆盖请求异常、JSON解析失败等其他偶发错误场景
  • 增加重试耗尽的兜底判断,不会在响应无效的情况下强制执行取值逻辑
  • 增加字段级校验,除了判断顶级标的键存在,还会校验lastPrice字段存在,避免接口返回结构不全触发KeyError
  • 修正原代码的缩进问题,保证循环层级正确

内容的提问来源于stack exchange,提问作者zanetampa911

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:12:13