由return语句和异常捕获之间的一个小细节来看Python的execution flow

46次阅读
没有评论

共计 962 个字符,预计需要花费 3 分钟才能阅读完成。

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

正文完
 
sharp097
版权声明:本站原创文章,由 sharp097 2021-04-02发表,共计962字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)