python笔记 finally

76 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

0 环境

  • 编辑器:pycharm或者vscode
  • 系统版本:windows10
  • python版本:3.9.6

1 finally

有时候会在别人的项目里,看到如下这段代码,已经知道了,捕获和处理异常,那么finally是啥呢,单看它的翻译最后,终于,在看里面的判断,假如f存在,结束这个f操作。连起来就是最后判断它存在,结束操作。假如我第一次接触finally,我现在知道了,它是最后收尾用的。

image.png

那么finally是不是意味着,不论什么情况都是要执行的,毕竟不管你异常还是正常结束,都是要执行下关闭,不然会浪费资源的。参考如下代码和结果,不管正常执行还是异常处理,最终finally都要执行。

try:
    raise Exception()
except Exception:
    print("123")    
finally:
    print("finally1")

try:
    a = 1
except Exception:
    print("456")    
finally:
    print("finally2")

image.png

有的人会想,我直接把关闭操作放在try里,在执行结束完后,才能关闭,假如中途抛出异常,最终不会走到关闭这不,是不是不合适呀,放在except里也不好呀,假如你是正常执行了,也是导致文件不会被关闭呀,所以finally多省心,把你想到的,帮你解决了。

然后我们运行这个程序,会报错,说这个f未定义。是不是说明,try没有增加新的作用域,类如像函数那种。 image.png

在try上面加个f = None就ok了。 image.png

还有个意义的现象就是当我们把它放到函数中,并且try和finally,都加了return,但最终结果是2,如下第二种图,我一路debug,先经过了return1然后return2。大佬的解释就是,finally在函数返回之前执行。 image.png

image.png

2 总结

finally无论try里是正常执行和抛出异常,最终都会执行它,有种不管你在世上怎么过的,最终都要死。还有个就是作用域的问题,最后就是函数中try...finally,都有return,最后会执行finally里的return返回给函数。