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
相关产品推荐
相关产品推荐

