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

为何捕获EOFError后程序未执行异常块代码直接退出?

EOFError捕获后字典打印不执行的问题分析

问题复现代码

假设你的代码类似如下:

grocery_list = {}

try:
    while True:
        item = input("输入商品名: ")
        quantity = int(input("输入数量: "))
        grocery_list[item] = quantity
except EOFError:
    print(grocery_list)

触发场景:在终端按Ctrl+D触发EOFError后,程序直接退出,未打印grocery_list的内容;但将异常块内代码改为print("EOF触发")时,能正常输出该字符串。

核心原因:标准输出缓冲机制

问题出在Python的标准输出缓冲上:

  • 默认情况下,终端的标准输出是「行缓冲」模式——只有当输出内容包含换行符、缓冲区满,或者程序正常退出时,才会将缓冲区内容刷新到终端。
  • 当你按Ctrl+D触发EOFError时,程序进入异常块执行print(grocery_list),但该操作仅将字典内容写入输出缓冲区,未触发缓冲刷新。而进程在异常处理完成后立即退出,缓冲区里的内容还没来得及输出到终端就被丢弃了。
  • 而打印简单字符串print("EOF触发")时,print()函数默认会在末尾添加换行符,触发行缓冲自动刷新,所以能看到输出。

解决方案

方案1:打印时强制刷新缓冲区

给print()添加flush=True参数,强制立即输出缓冲内容:

grocery_list = {}

try:
    while True:
        item = input("输入商品名: ")
        quantity = int(input("输入数量: "))
        grocery_list[item] = quantity
except EOFError:
    print(grocery_list, flush=True)

方案2:手动刷新标准输出

导入sys模块,手动调用刷新方法:

import sys
grocery_list = {}

try:
    while True:
        item = input("输入商品名: ")
        quantity = int(input("输入数量: "))
        grocery_list[item] = quantity
except EOFError:
    print(grocery_list)
    sys.stdout.flush()

验证结果

修改后再次按Ctrl+D,grocery_list的内容会正常输出到终端。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:07:07