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

Python中finally: txt.close()触发SyntaxError语法错误问题求助

Python finally块触发SyntaxError的原因与修复方案

错误原因

Python语法有明确强制规则:

  • finally 语句块必须和同一缩进层级的try结构配对使用,不允许跨缩进、跨代码块绑定其他位置的try/except。

你的报错代码里,try/except逻辑完全写在for循环的内部代码块中(缩进属于for的子级),但finally块被放在了for循环的外部,和for语句保持同级缩进。Python解析器扫描到这个finally时,找不到和它同层级匹配的try块,直接抛出语法错误。
当你删除finally块后,剩余的for循环+内部try/except结构完全符合语法要求,因此可以正常执行,得到预期的除零错误捕获输出。

修复方案

有两种符合语法的正确写法,其中第二种是Python文件操作的推荐最佳实践:

写法1:调整try/finally的配对层级

把文件打开后的所有业务逻辑包裹在和finally配对的外层try块中,保证try和finally同缩进、同层级,无论内部逻辑是否报错,最终都会执行文件关闭操作:

txt = open('temp5.txt','r')
try:
    for i in range(5):
        try:
            10/i-50
            print(i)
        except:
            print('error:', i)
finally:
    txt.close()

写法2:使用with上下文管理器(推荐)

Python操作文件时优先使用with语句,它会在代码块执行结束(无论正常结束还是中途报错)时自动关闭文件,不需要手动写close()和finally逻辑,从根源上避免文件句柄泄漏、语法配对错误的问题:

with open('temp5.txt', 'r') as txt:
    for i in range(5):
        try:
            10/i - 50
            print(i)
        # 建议明确指定捕获的异常类型,不要用裸except
        except ZeroDivisionError:
            print('error:', i)

运行上述修复后的代码,会和你之前正常运行的版本输出完全一致:

error: 0
1
2
3
4

补充提示:不建议使用无指定异常类型的裸except:,它会捕获所有异常(包括键盘中断、系统退出等不该被业务逻辑捕获的异常),排查问题时容易隐藏真实错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:57:49