Python实现API调用失败仅重试一次的错误处理是否合理?
API请求函数错误处理优化建议
你的代码整体逻辑和预期基本匹配,但有几个关键问题需要调整,尤其是你关注的失败分支处理:
核心问题:pass vs return None, None
绝对要用return None, None替代pass。原因很简单:
- 用
pass的话,函数会执行到末尾,默认返回None,而调用这个函数的循环里大概率是用dict1, dict2 = my_func(...)这种方式解包,这时候会抛出TypeError: cannot unpack non-iterable NoneType object,直接导致整个循环崩溃,完全违背你“单个页面错误不影响整体流程”的需求。 - 用
return None, None会返回一个包含两个None的元组,调用方可以正常解包,之后只需要判断dict1 is None就可以跳过该页面的后续处理,不会中断循环。
其他需要修复的问题
异常捕获后的返回逻辑缺失
当前代码在try块捕获异常后,只打印信息但没有返回值,同样会导致调用方解包失败。必须在except块最后加上return None, None。重试请求未做异常处理
第二次发起请求的时候没有包裹在try块里,如果这时候再抛出异常(比如网络再次中断),会直接跳出函数导致崩溃。需要给重试请求也加上异常捕获逻辑。重复代码冗余
两次成功分支的response.json()解析和返回逻辑完全一样,可以提取成单独的逻辑,避免代码重复。
优化后的代码
import requests as r import time def my_func(api_key, page): base_url = f'https://example.com/api/?limit=1000&page={page}' headers = {'Authorization': f"{api_key}", 'Content-Type': 'application/json'} def get_api_response(): """封装API请求逻辑,避免重复代码""" try: resp = r.get(url=base_url, headers=headers) resp.raise_for_status() # 自动触发4xx/5xx状态码的异常 return resp except Exception as e: print(f"API请求异常: {e}") return None # 第一次请求 response = get_api_response() if not response: # 第一次请求异常,重试一次 time.sleep(2) response = get_api_response() if not response: print(f"页面{page}两次请求均失败,跳过该页面") return None, None # 解析数据并返回 try: data = response.json() dict1 = data['dict1'] dict2 = data['dict2'] return dict1, dict2 except KeyError as e: print(f"页面{page}数据格式错误,缺失字段{e}") return None, None
逻辑验证
优化后的代码完全符合你的预期:
- 尝试发起API请求
- 异常时打印信息并返回None元组
- 首次请求失败(含异常)则休眠2秒重试
- 重试仍失败则打印信息并返回None元组,让调用方跳过该页面
- 任意一次请求成功则解析数据返回元组
内容的提问来源于stack exchange,提问作者mystiquenoir
相关产品推荐
相关产品推荐

