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

时间:2013-02-22 19:48:31

标签: python python-3.x filenotfoundexception ioerror

我有一个脚本,提示用户输入文件名(要打开的文件),如果当前目录中不存在该文件,则会再次提示用户。这是简短版本:

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,我通常不想要。

4 个答案:

答案 0 :(得分:63)

在3.3中,IOError became an alias for OSErrorFileNotFoundErrorOSError的子类。所以你可以试试

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

cwallenpoole在他的回答中更有说服力 (error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError))