在测试我的代码在超时情况下的行为时,我遇到了以下观察。当我通过以下方式发出请求时:
A。 requests.get('http://xxx.yy.com:8080/', timeout=(10.0001,0.000001))
,堆栈跟踪和Exception触发如下:
/.../anaconda3/lib/python3.4/site-packages/requests/sessions.py in send(self, request, **kwargs)
571
572 # Send the request
--> 573 r = adapter.send(request, **kwargs)
574
575 # Total elapsed time of the request (approximately)
/.../anaconda3/lib/python3.4/site-packages/requests/adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
431 raise SSLError(e, request=request)
432 elif isinstance(e, ReadTimeoutError):
--> 433 raise ReadTimeout(e, request=request)
434 else:
435 raise
ReadTimeout: HTTPConnectionPool(host='xxx.yy.com', port=8080): Read timed out. (read timeout=1e-06)
B。 session.get('http://xxx.yy.com:8080/', timeout=(10.0001,0.000001))
,堆栈跟踪和Exception触发如下:
/.../anaconda3/lib/python3.4/site-packages/requests/sessions.py in send(self, request, **kwargs)
571
572 # Send the request
--> 573 r = adapter.send(request, **kwargs)
574
575 # Total elapsed time of the request (approximately)
/.../anaconda3/lib/python3.4/site-packages/requests/adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
422 raise RetryError(e, request=request)
423
--> 424 raise ConnectionError(e, request=request)
425
426 except _ProxyError as e:
ConnectionError: HTTPConnectionPool(host='xxx.yy.com', port=8080): Max retries exceeded with url: / (Caused by ReadTimeoutError("HTTPConnectionPool(host='xxx.yy.com', port=8080): Read timed out. (read timeout=1e-06)",))
但是,就异常处理而言,这是根本不同的最终结果,令人惊讶! -似乎在使用session.get
时,需要抓住ConnectionError
而不是ReadTimeout
吗?这很不直观。有人可以建议吗?为什么会有所不同,以及如何/如何捕捉代码?
这是针对2.7.0版的请求。