You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Try Except:Finally子句的实际必要场景是什么?

Python try-finally 子句的独特作用

先看你给出的两段代码:

第一段(带finally):

try: some code
except: do this
else: do that
finally: always do

第二段(无finally,直接后续代码):

try: some code
except: do this
else: do that
always do

finally子句能完成不少第二段代码做不到的关键操作,核心就是无论try/except/else块里发生什么,finally的代码一定会执行,具体场景如下:

  • 应对try/except/else中的跳转或返回
    如果try、except或else块里有return、break、continue这类跳转语句,第二段的always do会被直接跳过,而finally里的代码不受影响,依然会执行。比如:

    # 带finally的情况
    def demo_return():
        try:
            print("执行try代码")
            return 1
        except:
            pass
        finally:
            print("finally执行了")
    
    demo_return()
    # 输出:
    # 执行try代码
    # finally执行了
    
    # 无finally的情况
    def demo_normal_return():
        try:
            print("执行try代码")
            return 1
        except:
            pass
        print("always do")
    
    demo_normal_return()
    # 输出:
    # 执行try代码
    # 不会打印"always do"
    
  • 处理异常传播中的执行确定性
    如果except或else块里抛出了新的异常,第二段的always do会因为异常中断而无法执行,但finally会先执行完自身代码,再把异常继续向上抛出。比如:

    # 带finally的情况
    def demo_exception():
        try:
            1/0
        except ZeroDivisionError:
            print("捕获除零异常")
            raise ValueError("新异常")
        finally:
            print("finally执行了")
    
    try:
        demo_exception()
    except ValueError:
        print("捕获新异常")
    # 输出:
    # 捕获除零异常
    # finally执行了
    # 捕获新异常
    
    # 无finally的情况
    def demo_normal_exception():
        try:
            1/0
        except ZeroDivisionError:
            print("捕获除零异常")
            raise ValueError("新异常")
        print("always do")
    
    try:
        demo_normal_exception()
    except ValueError:
        print("捕获新异常")
    # 输出:
    # 捕获除零异常
    # 捕获新异常
    # 不会打印"always do"
    
  • 确保资源的可靠释放
    操作文件、数据库连接、网络套接字这类资源时,finally是保证资源被关闭的最佳方式——不管代码是正常执行、报错,还是中途跳转,finally都能确保释放逻辑执行。比如:

    # 带finally保证文件关闭
    def read_file():
        f = open("test.txt", "r")
        try:
            content = f.read()
            return content
        except:
            pass
        finally:
            f.close()  # 无论如何都会关闭文件
    

    如果用第二段的写法,一旦try里return或者except里抛新异常,文件就会因没执行到f.close()而泄漏。

内容的提问来源于stack exchange,提问作者rebelxt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:22:41