为何捕获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
相关产品推荐
相关产品推荐

