Python 3.6.3异常处理失效:FileNotFoundError未被捕获求助
问题根源与修复方案
嘿,这问题一眼就能看出来啦——你把open()函数放在try代码块外面了!当你输入不存在的文件名时,open()抛出的FileNotFoundError根本没被后面的except捕获到,直接就触发了报错。
为什么原来的代码不管用?
你当前的代码执行顺序是:
- 先执行
f = open(txtFile, "r"),这一步如果文件不存在,立刻抛出异常 - 异常已经发生了,程序直接崩溃,
try块根本没机会执行
所以不管你用FileNotFoundError、OSError还是裸except:,都没用——因为异常发生在try的管辖范围之外呀!
修正后的代码方案
方案1:把open()放进try块里
txt = "" txtFile = input("gimme a file.") try: f = open(txtFile, "r") for line in f: cleanedLine = line.strip() txt += cleanedLine except FileNotFoundError: print("!") finally: # 手动关闭文件,避免资源泄漏 if 'f' in locals(): f.close()
方案2:用with语句(推荐,更简洁安全)
with语句会自动帮你管理文件资源,不用手动调用close(),是Python处理文件的最佳实践:
txt = "" txtFile = input("gimme a file.") try: with open(txtFile, "r") as f: for line in f: cleanedLine = line.strip() txt += cleanedLine except FileNotFoundError: print("!")
补充说明
- 裸
except:确实不规范,它会捕获所有异常(包括用户按Ctrl+C触发的KeyboardInterrupt这类你可能不想处理的异常),所以建议明确指定要捕获的异常类型,比如FileNotFoundError或者它的父类OSError。 - 用
with语句不仅能自动关闭文件,还能在发生异常时正确释放资源,比手动调用close()更可靠。
内容的提问来源于stack exchange,提问作者AyO
相关产品推荐
相关产品推荐

