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中用来引发异常
Copyright © 雪山凌狐教程 all right reserved,powered by Gitbook该文件修订时间: 2020-07-12 20:10:10

results matching ""

    No results matching ""