Python中如何处理API请求中途突发连接中断问题?
处理请求中途突发连接中断的方案
首先你当前的代码存在语法错误,requests.get携带HTTPBasicAuth的正确写法应该是:
res = requests.get(url="你的目标API地址", auth=HTTPBasicAuth(user, password))
针对请求中途突发连接中断的场景,单纯捕获ConnectionError不足以覆盖情况,这类中断通常会触发更具体的异常类型,以下是具体的处理方案:
1. 捕获针对性异常
请求中途断连常见的异常包括:
requests.exceptions.ChunkedEncodingError:服务器分块传输数据时中途断开连接ConnectionResetError:底层TCP连接被对方重置(比如服务器主动断开)requests.exceptions.Timeout:若设置了超时时间,中途断连也可能触发超时异常
你可以扩展try-except块来捕获这些异常:
import requests from requests.auth import HTTPBasicAuth user = "你的用户名" password = "你的密码" api_url = "目标API地址" try: # 务必设置超时时间,避免请求无限挂起 res = requests.get(api_url, auth=HTTPBasicAuth(user, password), timeout=30) # 主动检查响应状态,确保请求正常完成 res.raise_for_status() except requests.exceptions.ConnectionError: # 处理永久连接失败(你已实现的逻辑) print("无法建立初始连接") except (requests.exceptions.ChunkedEncodingError, ConnectionResetError): # 处理请求中途连接中断 print("请求过程中连接突发中断") except requests.exceptions.Timeout: # 处理超时导致的中断 print("请求超时") except requests.exceptions.RequestException as e: # 兜底捕获其他所有requests相关异常 print(f"请求出错: {str(e)}")
2. 临时波动场景:添加自动重试
中途断连很多时候是临时网络波动导致的,你可以结合重试机制自动重试请求。这里用tenacity库实现(先执行pip install tenacity安装):
import requests from requests.auth import HTTPBasicAuth from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type user = "你的用户名" password = "你的密码" api_url = "目标API地址" @retry( stop=stop_after_attempt(3), # 最多重试3次 wait=wait_exponential(multiplier=1, min=2, max=10), # 指数退避等待(避免频繁重试) retry=retry_if_exception_type((requests.exceptions.ChunkedEncodingError, ConnectionResetError, requests.exceptions.Timeout)) ) def send_api_request(): res = requests.get(api_url, auth=HTTPBasicAuth(user, password), timeout=30) res.raise_for_status() return res try: response = send_api_request() # 处理响应数据 print(response.json()) except requests.exceptions.RequestException as e: print(f"多次重试后仍请求失败: {str(e)}")
关键注意事项
- 必须设置
timeout:如果不设置超时,请求可能会一直挂起,无法触发异常捕获逻辑 res.raise_for_status():该方法会在响应状态码为4xx/5xx时抛出HTTPError,确保你能及时感知服务器返回的错误- 底层异常单独捕获:
ConnectionResetError是Python内置的OSError子类,不属于requests的异常体系,需要单独加入捕获列表
内容的提问来源于stack exchange,提问作者Zee
相关产品推荐
相关产品推荐

