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

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就可以跳过该页面的后续处理,不会中断循环。

其他需要修复的问题

  1. 异常捕获后的返回逻辑缺失
    当前代码在try块捕获异常后,只打印信息但没有返回值,同样会导致调用方解包失败。必须在except块最后加上return None, None。

  2. 重试请求未做异常处理
    第二次发起请求的时候没有包裹在try块里,如果这时候再抛出异常(比如网络再次中断),会直接跳出函数导致崩溃。需要给重试请求也加上异常捕获逻辑。

  3. 重复代码冗余
    两次成功分支的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:52:41