Python try except finally资源回收的实现

作者:laozhang 时间:2021-04-05 20:53:06 

Python 异常处理机制还提供了一个 finally 语句,通常用来为 try 块中的程序做扫尾清理工作。

注意,和 else 语句不同,finally 只要求和 try 搭配使用,而至于该结构中是否包含 except 以及 else,对于 finally 不是必须的(else 必须和 try except 搭配使用)。

在整个异常处理机制中,finally 语句的功能是:无论 try 块是否发生异常,最终都要进入 finally 语句,并执行其中的代码块。

基于 finally 语句的这种特性,在某些情况下,当 try 块中的程序打开了一些物理资源(文件、数据库连接等)时,由于这些资源必须手动回收,而回收工作通常就放在 finally 块中。

Python 垃圾回收机制,只能帮我们回收变量、类对象占用的内存,而无法自动完成类似关闭文件、数据库连接等这些的工作。

读者可能会问,回收这些物理资源,必须使用 finally 块吗?当然不是,但使用 finally 块是比较好的选择。首先,try 块不适合做资源回收工作,因为一旦 try 块中的某行代码发生异常,则其后续的代码将不会得到执行;其次 except 和 else 也不适合,它们都可能不会得到执行。而 finally 块中的代码,无论 try 块是否发生异常,该块中的代码都会被执行。

举个例子:


try:
 a = int(input("请输入 a 的值:"))
 print(20/a)
except:
 print("发生异常!")
else:
 print("执行 else 块中的代码")  
finally :
 print("执行 finally 块中的代码")

运行此程序:
请输入 a 的值:4
5.0
执行 else 块中的代码
执行 finally 块中的代码

可以看到,当 try 块中代码为发生异常时,except 块不会执行,else 块和 finally 块中的代码会被执行。

再次运行程序:
请输入 a 的值:a
发生异常!
执行 finally 块中的代码

可以看到,当 try 块中代码发生异常时,except 块得到执行,而 else 块中的代码将不执行,finally 块中的代码仍然会被执行。

finally 块的强大还远不止此,即便当 try 块发生异常,且没有合适和 except 处理异常时,finally 块中的代码也会得到执行。例如:


try:
 #发生异常
 print(20/0)
finally :
 print("执行 finally 块中的代码")

程序执行结果为:
执行 finally 块中的代码
Traceback (most recent call last):
  File "D:\python3.6\1.py", line 3, in <module>
    print(20/0)
ZeroDivisionError: division by zero

可以看到,当 try 块中代码发生异常,导致程序崩溃时,在崩溃前 Python 解释器也会执行 finally 块中的代码。

来源:http://c.biancheng.net/view/2316.html

标签:Python,try,except,finally
0
投稿

猜你喜欢

  • js截取字符串的方法

    2008-04-20 17:06:00
  • Python如何实现自动发送邮件

    2022-05-09 04:22:55
  • Python实现圣诞树的多种方法

    2023-07-27 01:02:20
  • Python实现多条件筛选目标数据功能【测试可用】

    2023-07-17 21:03:46
  • Dreamweaver虚拟在线试衣室

    2009-07-05 18:54:00
  • Python3简单实例计算同花的概率代码

    2023-07-20 16:23:03
  • python 实现调用子文件下的模块方法

    2022-02-02 16:39:38
  • PHP实现WebSocket实例详解

    2023-06-11 23:08:01
  • 详解python中的模块及包导入

    2023-12-05 08:20:16
  • PyQt5 QSerialPort子线程操作的实现

    2023-08-21 13:07:28
  • python 图片去噪的方法示例

    2021-12-10 19:42:25
  • 让XML在ASP中发挥其长处

    2008-01-16 19:07:00
  • Python实现判断给定列表是否有重复元素的方法

    2021-05-25 13:34:59
  • ASP 精华源码收集(五年总结)第1/20页

    2011-04-07 11:15:00
  • Python爬取世界杯热搜榜并制作脚本自动发送信息到邮箱的过程

    2021-01-21 20:35:53
  • 43个应当避免的Web设计错误

    2007-09-30 12:57:00
  • python http通信接口开发示例

    2022-06-07 05:15:29
  • 教你使用Python的pygame模块实现拼图游戏

    2022-06-28 03:20:20
  • Python 中的参数传递、返回值、浅拷贝、深拷贝

    2022-10-12 12:59:16
  • MySQL分页优化解析

    2008-12-22 14:56:00
  • asp之家 网络编程 m.aspxhome.com