# python3小白课:finally块回收资源 ### finally块的了解掌握 异常处理机制中,我们还可以加入finally块,通常用来做回收资源等的操作。比较典型的是打开了某个文件,使用完毕后需要关闭这样的处理,交给finally块来处理最合适不过。因为finally块是最后执行的,无论try块有没有异常,finally块的代码都会得以执行。即使在try块等代码中含有return等语句,也会先执行finally块的代码,才会执行return结束方法。 我们先来看一下结合了前面所学区块后的异常处理机制语法结构: ```python try: # 业务实现代码 ... except: # 如出现异常的处理代码 ... else: # try块没有异常会执行的代码 finally: # 一般用作资源回收块 ... ``` 可以看到,finally块是放在结构的最后方,需要注意顺序这一点。except块和finally块至少出现其中之一,也可以同时出现(所以except块也是可以没有的哦,但最好不要没有)。我们来看个小例子: ```python # coding:utf-8 try: a = 1 / 0 finally: print("执行完毕") ``` 这样执行,我们会发现,finally块的代码是可以正常执行的,即时try块有报错并且没有处理。 一般来讲,我们会这样写关闭打开的文件资源: ```python # 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我们将在后面的课程中讲到),否则可能会出现编程逻辑混乱等一些奇怪的情况。 我们来看一个小例子说明这件事: ```python # 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中用来引发异常 |