我有一个地方会提示用户输入一个文件名(一个文件,是要打开的)的脚本,如果文件没有在当前目录中,则再次提示用户。 下面是短版:
file = input("Type filename: ")
...
try:
fileContent = open(filename, "r")
...
except FileNotFoundError:
...
当我测试我的剧本在我的MacOS X在Python 3.3倍,它的工作,当我键入故意错误的文件名完全没有问题(它执行下“期望”套件)。
然而,当我想跑我在Python 3.2倍Windows计算机上的代码,我得到那个说:“FileNotFoundError”没有定义的错误。 因此,Python的3.2在Windows上认为“FileNotFoundError”是一个变量,程序与错误退出。
我想通了Python 3.2在Windows上抛出“IO错误”如果输入文件名是无效的。 我在Python 2.7测试它在我的Linux机器上,并且它也是一个IOError。
我的问题是,现在,该代码
except "FileNotFoundError":
无法在Windows的Python的3.2运行,但如果我将其更改为
except "IOError":
它不会在我的Mac工作了。
我怎么能解决呢? 我能想到的唯一的办法是只使用except
,我通常不希望。
在3.3, IOError
成为一个别名OSError
,和FileNotFoundError
是的一个子类OSError
。 所以,你可以尝试
except (OSError, IOError) as e:
...
这将投下相当大网,你不能假定异常“找不到文件”不检查e.errno
,但它可能覆盖您的使用案例。
PEP 3151论述了详细的改变的理由。
这给我的印象不是一个简单的更好except:
,但我不知道这是否是最好的解决办法:
error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError)
try:
f = open('.....')
except error_to_catch:
print('!')
因此,准确地抓到,只有当没有找到一个文件时,我做的:
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
你可以在同一时间赶2个错误
except (FileNotFoundError, IOError):
我不知道那是你在问什么。 我希望有一个更雄辩的解决方案,然后手动检查
try:
error_to_catch = FileNotFoundError
except NameError:
error_to_catch = IOError
except error_to_catch
cwallenpoole这是否有条件更雄辩地在他的回答(error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError))
文章来源: Python's “open()” throws different errors for “file not found” - how to handle both exceptions?