You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在requests循环请求中同时处理ConnectionError与非200状态码错误

我来帮你搞定这个问题!你需要同时处理请求返回的非200状态码和ConnectionError异常,还得保证循环能继续重试对吧?其实只需要把这两种情况的处理逻辑整合到try-except块里就行,下面给你详细的实现思路和代码示例:

核心实现思路

  1. while循环持续发起请求,直到成功获取数据(或者达到你设定的终止条件)
  2. try块里完成请求发送和状态码校验:如果返回状态码不是200,打印错误信息后直接进入下一次循环重试
  3. except块专门捕获ConnectionError异常,处理网络连接类的错误
  4. 可选添加延迟重试逻辑,避免频繁请求给服务器造成压力,也防止自己的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

火山引擎 最新活动