ConnectTimeout 和 ConnectionError 的差异

138 阅读1分钟

微信图片_20230808094553.png 随着网络请求库的不断发展和更新,开发者们在使用不同版本的requests库时,可能会遇到一些差异和问题。

首先,让我们看看问题的具体背景。用户在使用requests库的get方法时,遇到了以下情况:

import requests
requests.get('http://fake')

在2.8.0版本中,会抛出以下错误:

requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='fake', port=80): Max retries exceeded with url: /

而在2.7.0版本中,会抛出以下错误:

```python
requests.exceptions.ConnectionError: ('Connection aborted.', gaierror(-2, 'Name or service not known'))

这两个错误都涉及到了网络连接问题,但它们的具体表现和错误信息有所不同。这引起了开发者们的关注,他们开始研究问题的原因和解决方案。

针对这个问题,开发者Lukasa认为可能是urllib3库的问题,并怀疑可能是shazow/urllib3库引入的新版本引起的。他通过查看OpenStack gate的结果,发现可能是在1.10.4和1.11之间引入的。

进一步查找后,开发者Lukasa发现问题可能是在1.12版本中引入的。新的NewConnectionError类是ConnectTimeoutError类的子类,而以前的socket.error不会进入重试块。

开发者Lukasa认为,从requests库的角度来看,我们只需要将NewConnectionError视为不是超时,即使在底层urllib3会尝试重试。

综上,对于这个问题的解决方案可能是将NewConnectionError视为不是超时,这样在2.8.0版本中就不会抛出ConnectTimeout错误。开发者Lukasa将对此进行进一步的调查和处理。

总结

在使用requests库进行网络请求时,不同版本之间可能会出现一些差异和问题。