这个小细节的阐述将由一个小实验来展开,这个小实验依赖一个python库requests,用下面的命令安装一下:
1 |
$ pip install requests |
安装完之后我们来看下面的代码:
1 2 3 4 5 6 7 8 9 10 |
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来运行,首先来看一下运行结果:
1 2 3 4 5 6 7 8 |
$ 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的错误了,至于怎么修复,也很简单,留给诸君思考一下下了。