我有一个脚本,提示用户输入文件名(要打开的文件),如果当前目录中不存在该文件,则会再次提示用户。这是简短版本:
file = input("Type filename: ")
...
try:
fileContent = open(filename, "r")
...
except FileNotFoundError:
...
当我在Python 3.3x中使用我的MacOS X测试我的脚本时,如果我故意输入错误的文件名(它在“expect”下执行套件),它的效果非常好。
然而,当我想运行我的代码时 在Python 3.2x的Windows计算机上,我收到一条错误消息,指出未定义“FileNotFoundError”。因此,Windows上的Python 3.2认为“FileNotFoundError”是一个变量,程序退出并出现错误。
我发现如果输入文件名无效,Windows上的Python 3.2会抛出“IOError”。我在我的Linux机器上用Python 2.7测试过,它也是一个IOError。
我现在的问题是,带
的代码except "FileNotFoundError":
不会在Windows的Python 3.2上运行,但如果我将其更改为
except "IOError":
它不再适用于我的Mac。
我怎么能解决它?我能想到的唯一方法就是使用just
except
,我通常不想要。
答案 0 :(得分:63)
在3.3中,IOError
became an alias for OSError
和FileNotFoundError
是OSError
的子类。所以你可以试试
except (OSError, IOError) as e:
...
这会抛出相当广泛的网络,如果不检查e.errno
,你不能认为异常是“找不到文件”,但它可能会覆盖你的用例。
PEP 3151详细讨论了变更的基本原理。
答案 1 :(得分:9)
这让我感觉比简单except:
更好,但我不确定它是否是最佳解决方案:
error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError)
try:
f = open('.....')
except error_to_catch:
print('!')
答案 2 :(得分:5)
因此,只有在找不到文件时才能完全捕获,我这样做:
import errno
try:
open(filename, 'r')
except (OSError, IOError) as e: # FileNotFoundError does not exist on Python < 3.3
if getattr(e, 'errno', 0) == errno.ENOENT:
... # file not found
raise
答案 3 :(得分:2)
你可以同时捕获2个错误
except (FileNotFoundError, IOError):
我没有意识到这就是你的要求。我希望有一个更有说服力的解决方案然后手动检查
try:
error_to_catch = FileNotFoundError
except NameError:
error_to_catch = IOError
except error_to_catch
(error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError))