Python处理HTTP异常_网络错误处理思路

2次阅读

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

Python处理HTTP异常_网络错误处理思路

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不稳定场景。

text=ZqhQzanResources