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

Python循环中try/except执行成功后无法退出函数的问题

问题分析

你遇到的核心问题在于:

  1. for循环版本:请求成功后仅用break跳出循环,虽函数会自然结束,但缺少明确的return语句易引发流程误解;若try块中出现非requests.exceptions.RequestException类型的异常(比如json.dumps(data)序列化失败抛出的TypeError),会直接终止函数且不进入重试逻辑,导致后续调用无法执行。
  2. while循环版本:请求成功后仅设置success=True并break,同样缺少明确的return;且重试逻辑中retries += 1放在time.sleep之后,第一次失败后才会增加重试计数,可能导致重试次数超出预期。

修正后的实现

方案1:for循环重试(明确返回)

def api(url, data, head):
    tries = 6
    for i in range(tries):
        try:
            # 直接用requests内置的json参数,避免手动序列化出错
            req = requests.post(url, json=data, headers=head, timeout=3)
            req.raise_for_status()
            return req  # 请求成功立即返回,直接退出函数
        except requests.exceptions.RequestException as err:
            if i < tries - 1:
                continue  # 未到最后一次,继续重试
            raise  # 最后一次失败,抛出异常

方案2:while循环重试(优化逻辑)

def api(url, data, head):
    retries = 0
    max_retries = 6
    while retries <= max_retries:
        try:
            req = requests.post(url, json=data, headers=head, timeout=3)
            req.raise_for_status()
            return req  # 成功直接返回,退出函数
        except requests.exceptions.RequestException as err:
            if retries == max_retries:
                raise  # 重试耗尽,抛出异常
            wait = retries * 15
            logging.info(f"请求失败: {err},{wait}秒后重试")
            time.sleep(wait)
            retries += 1

关键优化点

  • 明确退出逻辑:请求成功后立即用return返回响应,确保函数直接退出,消除流程歧义。
  • 简化JSON处理:利用requests.post的json参数自动序列化数据,减少手动调用json.dumps引发的异常风险。
  • 严谨重试计数:调整重试计数的时机,确保重试次数符合预期,最后一次失败时明确抛出异常,便于上层调用处理。
  • 异常范围控制:若需要捕获序列化类异常,可将捕获范围扩大为except (requests.exceptions.RequestException, TypeError),根据实际需求调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:48:28