Python的“open()的”会因“找不到文件”不同的错误 - 如何处理这两个异常?(Python

2019-07-20 09:03发布

我有一个地方会提示用户输入一个文件名(一个文件,是要打开的)的脚本,如果文件没有在当前目录中,则再次提示用户。 下面是短版:

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 ,我通常不希望。

Answer 1:

在3.3, IOError成为一个别名OSError ,和FileNotFoundError是的一个子类OSError 。 所以,你可以尝试

except (OSError, IOError) as e:
   ...

这将投下相当大网,你不能假定异常“找不到文件”不检查e.errno ,但它可能覆盖您的使用案例。

PEP 3151论述了详细的改变的理由。



Answer 2:

这给我的印象不是一个简单的更好except: ,但我不知道这是否是最好的解决办法:

error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError)

try:
    f = open('.....')
except error_to_catch:
    print('!')


Answer 3:

因此,准确地抓到,只有当没有找到一个文件时,我做的:

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


Answer 4:

你可以在同一时间赶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?