Python finally案例如何最终执行

wen python案例 31

本文目录导读:

Python finally案例如何最终执行

  1. 案例1:正常执行 + finally
  2. 案例2:发生异常 + finally
  3. 案例3:try 块中有 return + finally
  4. 案例4:嵌套 try-finally
  5. 案例5:finally 中的 return 覆盖原有 return
  6. 唯一不执行的情况
  7. 实际应用场景:资源清理

在Python中,finally 子句一定会执行,无论 try 块中是否发生异常,或者是否使用了 returnbreakcontinue 等语句,但有一个极少数例外:程序被强制终止(如 os._exit()、系统崩溃、电源断电)。

以下是几个典型案例,展示 finally 的最终执行特性:

案例1:正常执行 + finally

def demo_normal():
    try:
        print("1. 正在执行 try 块")
        result = 10 / 2  # 正常运算
        print("2. 运算完成")
    except ZeroDivisionError:
        print("捕获到除零异常")
    finally:
        print("3. **finally 块始终执行**")
    print("4. 函数结束")
demo_normal()
# 输出:
# 1. 正在执行 try 块
# 2. 运算完成
# 3. **finally 块始终执行**
# 4. 函数结束

案例2:发生异常 + finally

def demo_exception():
    try:
        print("1. 正在执行 try 块")
        result = 10 / 0  # 触发异常
        print("2. 这行不会执行")
    except ZeroDivisionError:
        print("3. 捕获到除零异常")
    finally:
        print("4. **finally 块始终执行**")
    print("5. 函数结束")
demo_exception()
# 输出:
# 1. 正在执行 try 块
# 3. 捕获到除零异常
# 4. **finally 块始终执行**
# 5. 函数结束

案例3:try 块中有 return + finally

关键点finally 会在 return 之前执行

def demo_return():
    try:
        print("1. try 块中")
        return "2. try 返回值"
    finally:
        print("3. **finally 在 return 之前执行**")
    # 这行永远不会执行
    print("4. 永远不会执行")
result = demo_return()
print(f"函数返回值: {result}")
# 输出:
# 1. try 块中
# 3. **finally 在 return 之前执行**
# 函数返回值: 2. try 返回值

案例4:嵌套 try-finally

def demo_nested():
    try:
        print("外层 try")
        try:
            print("内层 try")
            raise ValueError("内层异常")
        finally:
            print("内层 finally")
    except ValueError as e:
        print(f"捕获异常: {e}")
    finally:
        print("外层 finally")
demo_nested()
# 输出:
# 外层 try
# 内层 try
# 内层 finally
# 捕获异常: 内层异常
# 外层 finally

案例5:finally 中的 return 覆盖原有 return

def demo_finally_return():
    try:
        return "try 的返回值"
    finally:
        return "finally 的返回值"  # 会覆盖 try 的 return
result = demo_finally_return()
print(result)  # 输出: finally 的返回值

唯一不执行的情况

import os
def demo_os_exit():
    try:
        print("try 块")
        os._exit(0)  # 强制终止进程
    finally:
        print("这行不会执行")  # 不会输出

实际应用场景:资源清理

def read_file_safely(filename):
    file = None
    try:
        file = open(filename, 'r')
        data = file.read()
        return data
    except FileNotFoundError:
        print(f"文件 {filename} 不存在")
        return None
    finally:
        if file:
            file.close()
            print("文件已关闭")
场景 finally 是否执行
try 正常执行
try 发生异常
try 中有 return ✅(在 return 之前)
except 中有 return
程序正常结束
os._exit() 强制退出
系统崩溃/断电

最佳实践:使用 finally 来释放资源(文件、网络连接、数据库连接等),确保即使发生异常也能正常清理。

抱歉,评论功能暂时关闭!