python处理http异常需分层捕获requests各类异常:connectionerror、timeout、httperror等,配合超时设置与5xx重试策略,构建健壮请求逻辑。

Python处理HTTP异常,核心是区分网络层错误和HTTP协议层错误,并针对性捕获与重试。requests库抛出的异常有明确分类,合理使用try-except配合状态码判断,就能构建健壮的网络请求逻辑。
明确requests常见异常类型
requests在请求失败时不会统一抛出Exception,而是按错误原因细分异常,需分别处理:
- ConnectionError:DNS失败、拒绝连接、网络不可达(如服务器关机、防火墙拦截)
- Timeout:包括connect timeout(建连超时)和read timeout(响应超时),建议分开设置
- TooManyRedirects:重定向次数超过默认上限(30次)
-
HTTPError:仅当调用
.raise_for_status()时触发,对应4xx/5xx响应状态码 - 普通
Exception</strong>(兜底):覆盖SSL错误、编码问题、无效URL等未被归类的异常</li></ul><H3>推荐的异常捕获结构</H3><p>不要只用一个except Exception:,应分层捕获,便于日志记录和差异化处理:</p><pre class='brush:python;toolbar:false;'>import requests from requests.exceptions import Timeout, ConnectionError, HTTPError <p>try: resp = requests.get(url, timeout=(3, 10)) # (connect, read) resp.raise_for_status() # 触发HTTPError(4xx/5xx) except ConnectionError: print("网络不通或域名无法解析") except Timeout: print("请求超时,请检查服务状态或调大timeout") except HTTPError as e: print(f"HTTP错误:{e.response.status_code} {e.response.reason}") except Exception as e: print(f"其他异常:{type(e).<strong>name</strong>} - {e}")对5xx错误做简单重试(非幂等操作慎用)
服务端临时错误(如502/503/504)适合重试,但注意:GET请求通常安全,POST/PUT等需确认是否幂等。可用
tenacity库或手写带退避的循环:立即学习“Python免费学习笔记(深入)”;
- 首次失败后等待1秒再试,最多3次
- 每次重试前检查是否为可重试状态码(如500、502、503、504)
- 记录每次重试日志,避免静默失败
超时设置要具体且合理
不设timeout等于把程序交给网络——可能卡死。推荐显式传入元组
(connect_timeout, read_timeout):- connect_timeout:通常0.5–3秒,过长会拖慢故障发现速度
- read_timeout:依业务而定,API接口建议5–15秒,文件下载可更长
- 避免只设单个数字(如timeout=10),它只作用于read阶段,connect仍用默认值
网络错误处理不是堆try-except,而是理解每类异常背后的网络含义,再决定是告警、重试、降级还是返回友好提示。清晰的分层捕获+合理的超时+有节制的重试,基本覆盖日常95%的HTTP不稳定场景。










