CodeWalk

Python 中 finally 和 return 的交互

作者:屠龙少年 · 2026-05-30 12:55

Python 中如果在 tryexcept 块中使用了 returnfinally 块还会执行吗?finally 中的 return 会覆盖前面的 return 吗?

回答

屠龙少年

finally始终执行,即使在 try/except 中有 return、break、continue。

def test():
    try:
        return 'from try'
    finally:
        print('finally executes')  # 始终打印
        # return 'from finally'  # 如果取消注释,覆盖 try 的 return

print(test())
# 输出:
# finally executes
# from try

关键规则

  1. finally 中的 return覆盖 try/except 中的 return
  2. finally 中的 raise 会覆盖 try/except 中的 return/raise
  3. 如果 finally 中没有 return/raise,原返回值保留
def test2():
    try:
        return 'try'
    finally:
        return 'finally'  # 覆盖!

print(test2())  # 'finally'

最佳实践:不要在 finally 中使用 return 或 raise。