python3小白课:finally块回收资源
finally块的了解掌握
异常处理机制中,我们还可以加入finally块,通常用来做回收资源等的操作。比较典型的是打开了某个文件,使用完毕后需要关闭这样的处理,交给finally块来处理最合适不过。因为finally块是最后执行的,无论try块有没有异常,finally块的代码都会得以执行。即使在try块等代码中含有return等语句,也会先执行finally块的代码,才会执行return结束方法。
我们先来看一下结合了前面所学区块后的异常处理机制语法结构:
try:
# 业务实现代码
...
except:
# 如出现异常的处理代码
...
else:
# try块没有异常会执行的代码
finally:
# 一般用作资源回收块
...
可以看到,finally块是放在结构的最后方,需要注意顺序这一点。except块和finally块至少出现其中之一,也可以同时出现(所以except块也是可以没有的哦,但最好不要没有)。我们来看个小例子:
# coding:utf-8
try:
a = 1 / 0
finally:
print("执行完毕")
这样执行,我们会发现,finally块的代码是可以正常执行的,即时try块有报错并且没有处理。
一般来讲,我们会这样写关闭打开的文件资源:
# coding:utf-8
def test():
# 先定义一个局部变量f,否则如果open报错,f变量将会找不到,if f语句会报错,找不到变量
f = None
try:
f = open("a.txt")
except Exception as e:
print(e)
return # 这个return是加来测试的,平时可以不加,有return的情况下,finally块的代码依然被执行
finally:
print("正在执行finally块的代码")
# if f指的是当f的布尔值不为False,就会执行后面的代码,如果文件没打开成功,则f布尔值为False
if f:
f.close()
test()
[!danger]
在finally块中,尽量不要使用return或者raise等导致方法中止的语句(raise我们将在后面的课程中讲到),否则可能会出现编程逻辑混乱等一些奇怪的情况。
我们来看一个小例子说明这件事:
# coding:utf-8
def test():
try:
return True
finally:
return False
a = test()
print(a)
[!question]
猜猜看,打印出来的会是True还是False?你可以在你电脑上试试看!
结果,是False!
为什么呢?我们可以来看一下程序运行的流程,首先调用test函数,执行try块的代码,碰到了return True这样的return语句,这时候程序会暂时不会执行它,先执行finally块中的代码,结果在里面遇到了return False语句,所以直接返回结束了该方法,这样结果就是False了。
异常处理可嵌套
我们学习了这么多的异常处理结构,每次遇到try块都是独立出现的吗?非也,有的时候根据业务需要我们还可以在try块、except块的内部再嵌套try...except语句,这就叫做异常处理的嵌套,这是支持的,比如在except处理的过程中,里面的代码又引发了新的异常?这时候就可以用异常处理嵌套来实现。
[!danger]
异常处理嵌套对于深度没有要求,但一般不要超过两层,太深其实也没有必要,太深容易降低程序代码的可读性。
单词释义
| 单词 | 释义 |
|---|---|
| finally | 最后 |
| close | 关闭 |
| raise | 提升,提起,在python中用来引发异常 |