finally语句 #

finally块无论是否发生异常都会执行。

一、基本语法 #

python
try:
    result = 10 / 0
except ZeroDivisionError:
    print("除零错误")
finally:
    print("清理工作")  # 总是执行

二、资源清理 #

python
# 文件操作
try:
    f = open('file.txt')
    content = f.read()
except FileNotFoundError:
    print("文件不存在")
finally:
    f.close()  # 确保关闭文件

# 使用with更简洁
with open('file.txt') as f:
    content = f.read()

# 数据库连接
try:
    conn = connect_database()
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users")
except DatabaseError:
    print("数据库错误")
finally:
    conn.close()  # 确保关闭连接

三、finally的执行时机 #

python
def test_finally():
    try:
        return "try"
    finally:
        print("finally执行")  # 在return之前执行

result = test_finally()  # 打印"finally执行"
print(result)  # "try"

# 即使有return,finally也会执行
def test():
    try:
        raise ValueError
    except:
        return "except"
    finally:
        print("finally")  # 仍会执行

四、finally与return #

python
def test():
    try:
        return 1
    finally:
        return 2  # 会覆盖try中的return

print(test())  # 2(不推荐这样写)

# 正确做法
def test():
    try:
        return 1
    finally:
        print("清理")  # 只做清理,不返回值

五、完整结构 #

python
try:
    # 可能出错的代码
    result = risky_operation()
except SomeError:
    # 处理异常
    handle_error()
else:
    # 无异常时执行
    process_result(result)
finally:
    # 总是执行
    cleanup()

六、最佳实践 #

python
# 使用contextlib简化
from contextlib import contextmanager

@contextmanager
def managed_file(filename):
    try:
        f = open(filename)
        yield f
    finally:
        f.close()

with managed_file('file.txt') as f:
    content = f.read()
最后更新:2026-03-16