Python3.14之后,finally不能这样写了!

欢迎访问Python3分钟系列。花3分钟时间,学习或温习一个Python知识点。

大家好,我是小K,今天再带大家学习一个Python 3.14的新特性。

禁止在 finally 块中使用 returnbreakcontinue 等控制流语句

这项更改由 PEP 765 提出,旨在提升代码的可读性和健壮性。

🧩 为什么禁止?

在 Python 的早期版本中,允许在 finally 块中使用如 returnbreakcontinue 这样的控制流语句。

虽然语法是合法的,但这种行为可能导致令人困惑的结果。

例如:

def func():
    try:
        return 1
    finally:
        return 2

print(func())  
# 输出结果是 2!

看起来函数应返回 1,但实际上 finally 中的 return 覆盖了原始返回值,最终输出的是 2

这种“意外覆盖”行为违背了大多数开发者的直觉,容易引发逻辑错误。

并且会给后期排错工作造成很大的麻烦…

✅ PEP 765 做了什么?

从 Python 3.14 开始,在 finally 块中使用以下控制流语句将引发SyntaxError

  • return
  • break
  • continue
  • yield
  • await
  • yield from

PEP 765 仅明确禁止了returnbreakcontinue 和 yield 在 finally 块中使用,但在 Python 3.14 的实际实现中,也扩展禁止了 yield from 和 await,以保证异步和生成器控制流的一致性。

示例:

def bad_func():
    try:
        return 1
    finally:
        return 2  
        
bad_func()        
# SyntaxError: cannot return in finally clause

注意:raise 仍被允许,因为它属于异常处理机制的一部分,不会造成类似的控制流混乱。

>> PEP 765入口 <<

💡 设计初衷

Python 核心团队希望开发者将 finally 块用于资源清理等操作,而不是作为控制流程的一部分。

通过禁止这类行为,Python 强制提升了代码的一致性和可维护性。

🔧 如何替代?

如果你之前依赖在 finally 中进行条件跳转或返回,建议将相关逻辑移到 try 块中处理,只在 finally 中执行必要的清理工作:

def safe_example():
    result = None
    do_cleanup = False
    try:
        result = 1
        do_cleanup = True
    finally:
        if do_cleanup:
            print("执行清理操作")
    return result

📌 最后强调

控制流语句
是否允许在 finally 中使用
return
❌ 不允许
break
❌ 不允许
continue
❌ 不允许
yield
❌ 不允许
await
❌ 不允许
raise
✅ 允许

finally 块应专注于清理资源,而非改变程序流向。

如果未来需要把Python版本升到3.14 或更高版本,需要检查代码是否在 finally 中使用了上述控制流语句,及时调整以避免运行时错误造成Bug。


如果你想加速Python学习,获得专业的指导,30天学会一门技能!

欢迎参加麦叔Python实战训练营,入门营机器学习营办公自动化营同步开放。


如果你希望我更新某个特定小知识,欢迎给我留言。

我是麦叔,聊编程,聊程序员人生

原文链接:https://www.zsiss.com/9026.html,转载请注明出处。
0

评论0

请先
响应式建筑科技木屋定制网站模板ZS28576
响应式建筑科技木屋定制网站模板ZS28576
3分钟前 有人购买 去瞅瞅看

社交账号快速登录