这个小细节的阐述将由一个小实验来展开,这个小实验依赖一个python库requests,用下面的命令安装一下:
$ pip install requests
安装完之后我们来看下面的代码:
import requests
def main():
try:
resp = requests.get('https://httpstat.us/200?sleep=5000', timeout=3)
status_code = resp.status_code
except requests.exceptions.Timeout as e:
print(str(e))
return status_code
print(main())
上述代码由于请求了一个https的地址,所以最好用python3来运行,首先来看一下运行结果:
$ python3 demo.py
HTTPSConnectionPool(host='httpstat.us', port=443): Read timed out. (read timeout=3)
Traceback (most recent call last):
File "demo.py", line 10, in <module>
print(main())
File "demo.py", line 8, in main
return status_code
UnboundLocalError: local variable 'status_code' referenced before assignment
为什么会报错呢,原因就在于我们请求的url中加了一个叫 sleep=5000的参数,代表这个url会等待5秒才会返回内容,而我们在requests的get方法中却指定了timeout=3,也就是3秒,那么很显然就会抛出异常了,我们在上面的输出结果中也看到了 Read timed out 的异常。
其实上面的报错很好理解,当发生异常时python程序的execution flow就会不执行 status_code = resp.status_code 这一行代码,转而跳到了异常捕获后的代码去执行,也就是print(str(e)),打印出来异常对象,然后紧接着执行 return status_code 这一行代码的时候就会报上面的未assignment的错误了,至于怎么修复,也很简单,留给诸君思考一下下了。