本文目录导读:

- 案例1:正常执行 + finally
- 案例2:发生异常 + finally
- 案例3:try 块中有 return + finally
- 案例4:嵌套 try-finally
- 案例5:finally 中的 return 覆盖原有 return
- 唯一不执行的情况
- 实际应用场景:资源清理
在Python中,finally 子句一定会执行,无论 try 块中是否发生异常,或者是否使用了 return、break、continue 等语句,但有一个极少数例外:程序被强制终止(如 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 来释放资源(文件、网络连接、数据库连接等),确保即使发生异常也能正常清理。