98 lines
3.7 KiB
Markdown
98 lines
3.7 KiB
Markdown
# 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中用来引发异常 | |