python3xiaobaike_2020/chapter8/8-5 python3小白课:finally块回收资源.md
2025-04-20 23:22:14 +08:00

98 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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中用来引发异常 |