在网络请求和与外部系统交互的场景中,错误处理非常重要;
为什么需要错误处理
- 确保程序稳定性;没有错误处理的程序在遇到异常时会直接崩溃或停止执行,这在生产环境中尤其危险。
- 应对不可控因素;比如网络连接质量、服务器响应时间、服务器是否在线等。
- 处理和诊断问题;通过捕获和处理异常,可以记录错误日志,捕捉错误细节,有助于后续的调试和问题排查。
- 提高用户体验;在没有错误处理的情况下,用户可能遇到程序崩溃或无法响应的情况。而通过错误处理,你可以向用户提供友好的提示信息,解释问题所在,并建议下一步操作。例如,当网络中断时,可以告诉用户稍后重试。
- 保障数据完整性;如果程序在某些操作失败时没有处理错误,可能会导致数据丢失或不一致。通过在关键操作前后进行错误处理,可以确保数据的完整性和安全性。
- 应对 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 | 在重试请求时超出了最大重试次数,通常是由于持续的网络故障或服务器不可用。 |