requests模块使用中常见的错误与异常

网络问题

遇到网络问题(如:DNS 查询失败、拒绝连接等)时,requests 会抛出一个 ConnectionError 异常。

请求不成功(状态码)

如果 HTTP 请求返回了不成功的状态码(4XX客户端错误,或者5XX服务端错误), Response.raise_for_status() 会抛出一个 HTTPError 异常。

例如:

>>> bad_r = requests.get('http://httpbin.org/status/404')
>>> bad_r.status_code
404

>>> bad_r.raise_for_status()
Traceback (most recent call last):
  File "requests/models.py", line 832, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error

假如我们的响应是正常的(200),raise_for_status方法就会返回None:

>>> r.raise_for_status()
None

通常我们也可以检查状态码:

>>> r = requests.get(url)
>>> r.status_code
200

requests还附带一个内置的状态码查询对象

>>> r.status_code == requests.codes.ok
True

超时

若请求超时,则抛出一个 Timeout 异常。

连接超时指的是在你的客户端实现到远端机器端口的连接时(对应的是connect()_),Request 会等待的秒数。一个很好的实践方法是把连接超时设为比 3 的倍数略大的一个数值,因为 TCP 数据包重传窗口 (TCP packet retransmission window) 的默认大小是 3。

一旦你的客户端连接到了服务器并且发送了 HTTP 请求,读取超时指的就是客户端等待服务器发送请求的时间。(特定地,它指的是客户端要等待服务器发送字节之间的时间。在 99.9% 的情况下这指的是服务器发送第一个字节之前的时间)。

你可以告诉 requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应

>>>requests.get('http://github.com', timeout=0.001)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)

也可以通过设置重连次数,请求超时时多次尝试重新请求,尽最大努力请求网站成功
例如:

# 设置重连次数20次
requests.adapters.DEFAULT_RETRIES = 20

所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException

猜你喜欢

转载自blog.csdn.net/weixin_41798450/article/details/88659018