Python finally分支

1. finally分支的基本原理

语法结构

try:
    # 可能出错的代码
except 异常类型 as e:
    # 处理异常
finally:
    # 无论是否发生异常,这里的代码都会被执行
  • finally分支:无论try块中的代码是否发生异常,finally块中的代码总会被执行
  • 主要用于资源回收,确保程序占用的资源能够被及时释放,防止资源泄漏。

2. 资源回收的意义

为什么要资源回收?

  • 程序运行时会占用各种资源(如文件、网络、数据库、内存等)。
  • 如果不及时释放这些资源,可能导致资源泄漏,影响系统性能,甚至导致程序或系统崩溃。

常见需要回收的资源

  1. 打开的文件
    • 文件句柄有限,长时间不关闭会耗尽系统资源。
  2. 网络套接字连接
    • 网络连接不关闭会占用端口和带宽,影响通信。
  3. 数据库连接
    • 数据库连接池资源有限,未释放会导致新连接无法建立。
  4. 多线程、多进程
    • 线程/进程未正确关闭会导致“僵尸”进程或线程,浪费CPU和内存。
  5. 内存分配
    • 某些情况下需要手动释放内存(如C扩展、第三方库等)。

3. 你的代码详解

try:
    file = open('...txt', 'r')
    ...
    ...
except Exception as e:
    pass
finally:
    file.close()

解释

  • file = open('...txt', 'r'):打开一个文件,获得文件对象file
  • ...:对文件进行操作,可能会出错(如文件不存在、读取错误等)。
  • except Exception as e::捕获所有异常,防止程序崩溃。
  • finally: file.close()无论try块是否出错,都会执行file.close(),确保文件被关闭

4. finally的执行时机

  • try块正常执行完毕,执行finally。
  • try块发生异常,执行except后,执行finally。
  • try块发生异常但未被except捕获,执行finally后再抛出异常。
  • try块或except块中有return语句,finally依然会被执行

5. finally的典型应用场景

1. 文件操作

try:
    f = open('data.txt', 'r')
    data = f.read()
except Exception as e:
    print("文件操作出错:", e)
finally:
    f.close()

2. 网络连接

import socket
s = socket.socket()
try:
    s.connect(('example.com', 80))
    s.sendall(b'GET / HTTP/1.1\r\n\r\n')
    response = s.recv(1024)
except Exception as e:
    print("网络错误:", e)
finally:
    s.close()

3. 数据库连接

import sqlite3
conn = sqlite3.connect('test.db')
try:
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM users')
    result = cursor.fetchall()
except Exception as e:
    print("数据库操作出错:", e)
finally:
    conn.close()

4. 多线程/多进程

import threading
lock = threading.Lock()
try:
    lock.acquire()
    # 临界区操作
finally:
    lock.release()

6. 注意事项

1. finally中资源对象的初始化

  • 如果open()本身就抛出异常,file变量不会被赋值,finallyfile.close()会报UnboundLocalError
  • 改进写法
file = None
try:
    file = open('...txt', 'r')
    # ...
except Exception as e:
    print("出错:", e)
finally:
    if file:
        file.close()

2. 推荐使用with语句(上下文管理器)

  • Python推荐用with语句自动管理资源,无需手动调用close(),更安全简洁。
try:
    with open('...txt', 'r') as file:
        # 文件操作
        ...
except Exception as e:
    print("出错:", e)
# with块结束后,文件自动关闭

7. 总结

  • finally分支保证了资源的正确释放,是编写健壮程序的重要手段。
  • 主要用于资源回收,如文件、网络、数据库、线程等。
  • 注意资源对象的初始化,避免finally中访问未定义变量。
  • 推荐用with语句简化资源管理。

你可能感兴趣的:(Python finally分支)