Python循环中try/except执行成功后无法退出函数的问题
问题分析
你遇到的核心问题在于:
- for循环版本:请求成功后仅用
break跳出循环,虽函数会自然结束,但缺少明确的return语句易引发流程误解;若try块中出现非requests.exceptions.RequestException类型的异常(比如json.dumps(data)序列化失败抛出的TypeError),会直接终止函数且不进入重试逻辑,导致后续调用无法执行。 - 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
相关产品推荐
相关产品推荐

