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 有 return | return → finally |
| finally 有 return | finally 的 return 覆盖其他 |
要点总结
- finally 无论是否异常都执行
- 用于资源清理:文件关闭、连接释放
- finally 在 return 之后执行
- finally 中 return 会覆盖原返回值(避免使用)
- 未捕获异常时,先 finally 再抛出异常
📝 发现内容有误?点击此处直接编辑