背景
今天有用户在访问web系统时,出现了Nginx返回的超时报错。经排查是由于某台服务器异常,导致web系统requests请求时,一直等待响应,等待时间超过了Nginx配置的超时时间,所以Nginx就直接返回了。
思路
- 配置timeout
一般在使用requests库时,是不设置超时时间的,那么请求就会一直等待,直到某一方关闭。所以在发请求的时候手工指定下timeout参数。
requests的timeout配置如下:
1 | def request(method, url, **kwargs): |
官网介绍如下:
如果你制订了一个单一的值作为timeout,如下所示:
1 | r = requests.get('https://github.com', timeout=5) |
这一timeout值将会用作 connect和 read二者的 timeout。如果要分别制定,就传入一个元组:
1 | r = requests.get('https://github.com', timeout=(3.05, 27)) |
如果远端服务器很慢,你可以让 Request 永远等待,传入一个None作为timeout值,然后就冲咖啡去吧。
1 | r = requests.get('https://github.com', timeout=None) |
http://docs.python-requests.org/zh_CN/latest/user/advanced.html#timeout
- 捕获异常
通过try... except...可以捕获异常。获取的异常信息如下:

在老版本的python中,有e.message可以获取str格式的报错信息,但要注意的是,虽然在定义中e.message是str类型的,但是实际上未必。类型错误的话,在后续的处理中就可能会造成其他异常了。
1 | # e.message 定义 |
而在新版本的python中,e.message已经被淘汰了。
1 | class BaseException(object): |
https://www.python.org/dev/peps/pep-0352/#transition-plan
所以可以用e.args来获取异常说明,e.args返回的是一个tuple,直接通过str(e.args)转换成str类型做后续处理。
结论
代码如下,对不通原因造成的异常,可以加不同的except。
1 | import requests |
