在网络请求和与外部系统交互的场景中,错误处理非常重要;

为什么需要错误处理

  1. 确保程序稳定性;没有错误处理的程序在遇到异常时会直接崩溃或停止执行,这在生产环境中尤其危险。
  2. 应对不可控因素;比如网络连接质量、服务器响应时间、服务器是否在线等。
  3. 处理和诊断问题;通过捕获和处理异常,可以记录错误日志,捕捉错误细节,有助于后续的调试和问题排查。
  4. 提高用户体验;在没有错误处理的情况下,用户可能遇到程序崩溃或无法响应的情况。而通过错误处理,你可以向用户提供友好的提示信息,解释问题所在,并建议下一步操作。例如,当网络中断时,可以告诉用户稍后重试。
  5. 保障数据完整性;如果程序在某些操作失败时没有处理错误,可能会导致数据丢失或不一致。通过在关键操作前后进行错误处理,可以确保数据的完整性和安全性。
  6. 应对 API 变化;在与外部 API 交互时,API 可能发生变化,比如接口格式、状态码等。

无错误处理 VS 有错误处理

无错误处理的代码:

import requests

response = requests.get("https://example.com/api/data")
print(response.json())

如果请求失败或 API 不可用,程序将直接崩溃,并抛出异常,用户将无法理解发生了什么问题。

有错误处理的代码

import requests

try:
    response = requests.get("https://example.com/api/data")
    response.raise_for_status()
    data = response.json()
    print(data)
except requests.exceptions.HTTPError as http_err:
    print(f"HTTP error occurred: {http_err}")
except requests.exceptions.ConnectionError as conn_err:
    print(f"Connection error occurred: {conn_err}")
except requests.exceptions.Timeout as timeout_err:
    print(f"Timeout error occurred: {timeout_err}")
except requests.exceptions.RequestException as req_err:
    print(f"An error occurred: {req_err}")

在这个例子中,程序能够处理不同类型的错误并给出适当的反馈,而不会导致崩溃。

常见Requests 错误列表

异常 描述
RequestException 这是所有 requests 异常的基类;
InvalidJSONError 响应数据不是合法的 JSON 格式,可能是返回了 HTML 或其他非 JSON 格式的内容。
JSONDecodeError 响应内容无法被解析为 JSON,通常是因为返回的数据格式不正确或数据被截断。
HTTPError HTTP 请求返回了不成功的状态码(如 4xx 或 5xx),表示客户端或服务器发生了错误。
ConnectionError 网络连接失败,可能是因为目标服务器不可达、DNS 解析错误或网络中断。
ProxyError 在使用代理进行请求时,代理服务器无法连接或返回错误,导致请求失败。
SSLError SSL 证书验证失败,可能是因为证书无效、过期或未被信任。
Timeout 请求超时,通常是由于服务器未在设定的时间内响应或网络延迟过高。
ConnectTimeout 连接超时,通常是由于无法在设定的时间内建立与目标服务器的连接。
ReadTimeout 读取超时,通常是由于服务器未在设定的时间内发送响应数据。
URLRequired 请求缺少有效的 URL,导致无法执行 HTTP 请求。
TooManyRedirects 请求过程中发生了过多的重定向,超过了允许的最大重定向次数,通常是由于循环重定向或错误的 URL 配置。
MissingSchema 请求的 URL 缺少必要的协议部分(如 http:// 或 https://),导致无法识别 URL。
InvalidSchema 请求的 URL 使用了不支持的或无效的协议(如 abc://),导致无法处理请求。
InvalidURL 提供的 URL 格式不正确,包含非法字符或结构不符合规范。
InvalidHeader 请求头部包含无效或不符合规范的字段,可能是因为字段名称或值格式错误。
InvalidProxyURL 提供的代理 URL 格式不正确或包含无效的字符,导致无法建立代理连接。
ChunkedEncodingError 响应的内容以分块编码传输时,接收的分块数据不完整或格式错误,导致无法正确解析。
ContentDecodingError 响应的内容在解码过程中出现错误,通常是因为数据格式不符合指定的解码类型,如 gzip 或 deflate。
StreamConsumedError 尝试读取一个已经被消费的响应流,通常是因为对响应对象进行了多次读取,而 requests 的响应流只能被读取一次。
RetryError 在重试请求时超出了最大重试次数,通常是由于持续的网络故障或服务器不可用。