全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-19 5 分钟 ✍️ juanwangdev

Python finally子句

finally 子句无论是否发生异常都会执行,用于资源清理。

基本语法

标准结构

Python
try:
    # 可能出错的代码
except:
    # 异常处理
finally:
    # 必定执行的代码

基本示例

Python
try:
    result = 10 / 0
except ZeroDivisionError:
    print("除零错误")
finally:
    print("清理完成")

# 输出:
# 除零错误
# 清理完成

执行时机

无论是否异常都执行

Python
# 无异常情况
try:
    result = 10 / 2
    print("计算成功")
finally:
    print("finally 执行")

# 输出:
# 计算成功
# finally 执行

# 有异常情况
try:
    result = 10 / 0
except ZeroDivisionError:
    print("处理异常")
finally:
    print("finally 执行")

# 输出:
# 处理异常
# finally 执行

未捕获异常时仍执行

Python
try:
    result = 10 / 0  # 未捕获
finally:
    print("finally 执行")  # 先执行 finally

# 输出:finally 执行
# 然后抛出 ZeroDivisionError

资源清理

文件资源清理

Python
file = None
try:
    file = open("data.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("文件不存在")
finally:
    if file:
        file.close()
        print("文件已关闭")

使用 with 替代(推荐)

Python
# with 自动处理 finally
try:
    with open("data.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("文件不存在")
# 文件自动关闭,无需手动 finally

数据库连接清理

Python
conn = None
try:
    conn = create_connection()
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users")
except DatabaseError as e:
    print(f"数据库错误: {e}")
finally:
    if conn:
        conn.close()
        print("连接已关闭")

finally 与 return

finally 在 return 之后执行

Python
def test():
    try:
        return "try"
    finally:
        print("finally 执行")

result = test()
print(f"返回值: {result}")

# 输出:
# finally 执行
# 返回值: try

finally 可覆盖 return 值

Python
def test():
    try:
        return "try"
    finally:
        return "finally"  # 覆盖 try 的返回值

result = test()
print(result)  # finally

避免在 finally 中使用 return,会覆盖 try/except 的返回值。

finally 与异常

finally 执行后继续抛出异常

Python
try:
    result = 10 / 0
finally:
    print("清理")

# 输出:清理
# 然后抛出 ZeroDivisionError

finally 中抛出新异常

Python
try:
    result = 10 / 0
finally:
    raise ValueError("新异常")

# 原异常被覆盖,抛出 ValueError

完整结构

try-except-finally 组合

Python
try:
    risky_operation()
except ValueError:
    handle_value_error()
except TypeError:
    handle_type_error()
finally:
    cleanup()

try-finally 无 except

Python
try:
    risky_operation()
finally:
    cleanup()  # 清理后异常继续抛出

执行顺序对比

情况执行顺序
无异常try → finally
有异常且捕获try → except → finally
有异常未捕获try → finally → 抛出异常
try 有 returnreturn → finally
finally 有 returnfinally 的 return 覆盖其他

要点总结

  1. finally 无论是否异常都执行
  2. 用于资源清理:文件关闭、连接释放
  3. finally 在 return 之后执行
  4. finally 中 return 会覆盖原返回值(避免使用)
  5. 未捕获异常时,先 finally 再抛出异常

📝 发现内容有误?点击此处直接编辑

← 上一篇 Python默认参数
下一篇 → Python try-except语句
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库