如何在requests循环请求中同时处理ConnectionError与非200状态码错误
我来帮你搞定这个问题!你需要同时处理请求返回的非200状态码和ConnectionError异常,还得保证循环能继续重试对吧?其实只需要把这两种情况的处理逻辑整合到try-except块里就行,下面给你详细的实现思路和代码示例:
核心实现思路
- 用
while循环持续发起请求,直到成功获取数据(或者达到你设定的终止条件) - 在
try块里完成请求发送和状态码校验:如果返回状态码不是200,打印错误信息后直接进入下一次循环重试 - 用
except块专门捕获ConnectionError异常,处理网络连接类的错误 - 可选添加延迟重试逻辑,避免频繁请求给服务器造成压力,也防止自己的IP被限制
基础版代码示例
import requests import time while True: try: # 发送请求 response = requests.get("你的目标API地址") # 先处理状态码非200的情况 if response.status_code != 200: print(f"请求失败,返回状态码: {response.status_code}") time.sleep(2) # 等待2秒再重试,可根据需求调整时长 continue # 状态码正常,处理获取到的数据 print("数据获取成功!") data = response.json() # 假设返回JSON格式数据,根据实际情况调整 # 这里可以添加数据解析、保存等逻辑 # 如果只需要单次成功获取就退出循环,保留break;如果要持续获取就去掉 break except requests.exceptions.ConnectionError as conn_err: # 捕获连接错误,比如网络断开、服务器拒绝连接等 print(f"连接出错啦: {str(conn_err)}") time.sleep(2) # 可选:捕获其他未预料的异常,防止程序崩溃 except Exception as err: print(f"遇到未知错误: {str(err)}") time.sleep(2)
进阶优化:添加最大重试次数
如果不想无限循环重试,可以设置一个最大重试次数,超过次数就终止循环:
import requests import time max_retry_times = 10 # 自定义最大重试次数 current_retry = 0 while current_retry < max_retry_times: try: response = requests.get("你的目标API地址") if response.status_code != 200: print(f"请求失败,状态码: {response.status_code} | 重试次数: {current_retry+1}/{max_retry_times}") current_retry += 1 time.sleep(2) continue print("数据获取成功!") data = response.json() # 处理数据逻辑 break except requests.exceptions.ConnectionError as conn_err: print(f"连接错误: {str(conn_err)} | 重试次数: {current_retry+1}/{max_retry_times}") current_retry += 1 time.sleep(2) except Exception as err: print(f"未知错误: {str(err)} | 重试次数: {current_retry+1}/{max_retry_times}") current_retry += 1 time.sleep(2) else: # 当循环正常结束(没触发break),说明重试次数用完了 print(f"已尝试{max_retry_times}次,请求仍未成功,终止重试")
关键点说明
- 状态码检查:一定要放在
try块里,因为如果请求抛出异常的话,response对象根本不会被创建,放在外面会报错 - 延迟重试:
time.sleep()是个很实用的小技巧,避免短时间内大量请求触发服务器的限流机制 - 异常捕获范围:尽量精准捕获异常(比如先抓
ConnectionError,再抓通用Exception),这样能更清晰地定位问题类型
内容的提问来源于stack exchange,提问作者Karnivaurus




