Requests - 错误处理
Requests - 处理错误
Section titled “Requests - 处理错误”本章讨论在使用 Requests 库时如何优雅地处理错误。强大的错误管理对于构建可靠的应用程序至关重要。
常见的异常类型
Section titled “常见的异常类型”requests 库有一个基类异常 requests.exceptions.RequestException,大多数其他异常都继承自它。你会遇到的一些常见异常如下:
requests.exceptions.ConnectionError:当出现网络问题(例如,DNS 解析失败、连接被拒绝)时抛出。
requests.exceptions.HTTPError:当 response.raise_for_status() 遇到非成功的状态码(4xx 客户端错误或 5xx 服务器错误)时抛出。
requests.exceptions.Timeout:超时相关错误的基类。
requests.exceptions.ConnectTimeout:在尝试连接远程服务器时发生连接超时时抛出。
requests.exceptions.ReadTimeout:如果在指定的 timeout 超时时间内服务器没有发送任何数据时抛出。
requests.exceptions.TooManyRedirects:如果请求超过配置的最大重定向次数时抛出。
requests.exceptions.JSONDecodeError:当 response.json() 无法将响应内容解码为 JSON 时抛出。技术上它源自 json.JSONDecodeError,但在使用 response.json() 时经常遇到。
使用 Try-Except 处理错误
Section titled “使用 Try-Except 处理错误”标准的 Python try-except 代码块是处理这些异常的最佳方法。
示例:处理超时和 HTTP 错误
Section titled “示例:处理超时和 HTTP 错误”此示例演示了如何捕获 ConnectTimeout 和 HTTPError 异常。requests.get() 中的 timeout 参数可以是用于连接和读取超时的单个浮点数,也可以是元组 (connect_timeout, read_timeout)。
import requests
try: # Using a very short timeout to deliberately cause a ConnectTimeout # Using a URL that might return an error for HTTPError demonstration (e.g., if it required auth) response = requests.get('https://jsonplaceholder.typicode.com/users', timeout=(0.001, 5)) # (connect_timeout, read_timeout)
# Check for HTTP errors (4xx or 5xx status codes) response.raise_for_status() # This will raise an HTTPError if the response was an HTTP error
print("Request successful!") # print(response.json()) # Process the response if successful
except requests.exceptions.ConnectTimeout as e: print(f"Connection Timeout Error: {e}")except requests.exceptions.ReadTimeout as e: print(f"Read Timeout Error: {e}")except requests.exceptions.HTTPError as e: print(f"HTTP Error: {e}")except requests.exceptions.RequestException as e: # Catch any other RequestException print(f"An error occurred: {e}")潜在输出(针对 ConnectTimeout)
Section titled “潜在输出(针对 ConnectTimeout)”Connection Timeout Error: HTTPSConnectionPool(host='jsonplaceholder.typicode.com', port=443): Max retries exceeded with url: /users (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x...>, 'Connection to jsonplaceholder.typicode.com timed out. (connect timeout=0.001)'))注意:确切的错误消息和对象地址(如 0x...)可能会因你的环境和 Requests 库版本而略有不同。
使用 response.raise_for_status() 是一种方便的方式,可以确保你的程序能对糟糕的 HTTP 响应做出反应。始终将你的请求封装在 try-except 代码块中,以优雅地处理潜在问题。