这个小细节的阐述将由一个小实验来展开,这个小实验依赖一个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的错误了,至于怎么修复,也很简单,留给诸君思考一下下了。