Python的“open()”为“文件未find”抛出不同的错误 – 如何处理这两个exception?

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

file = input("Type filename: ") ... try: fileContent = open(filename, "r") ... except FileNotFoundError: ... 

当我在Python 3.3x的MacOS X上testing我的脚本时,当我input错误的文件名(它在“expect”下执行套件)时,它工作得很好。

但是,当我想在Python 3.2x的Windows计算机上运行我的代码时,出现“FileNotFoundError”未定义的错误。 所以,Windows上的Python 3.2认为“FileNotFoundError”是一个variables,程序退出时出现错误。

我发现如果input文件名无效的话,Windows 3.2上的Python 3.2会抛出一个“IOError”。 我在Python 2.7的Linux机器上testing了它,它也是一个IOError。

我的问题是,现在的代码与

 except "FileNotFoundError": 

不会在Windows的Python 3.2上运行,但如果我改变它

 except "IOError": 

它不会在我的Mac上工作了。

我怎么能解决它? 我能想到的唯一方法就是使用except我通常不想要的东西。

在3.3中, IOError成为OSError的别名 ,而FileNotFoundErrorOSError的子OSError 。 所以你可以试试

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

这会造成一个相当宽的networking,并且您不能在没有检查e.errno情况下假定exception是“文件未find”,但可能会覆盖您的用例。

PEP 3151详细讨论了变化的基本原理。

except: ,我觉得这比简单的更好,但我不确定这是否是最好的解决scheme:

 error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError) try: f = open('.....') except error_to_catch: print('!') 

你可以同时捕获2个错误

except (FileNotFoundError, IOError):

我没有意识到这是你所问的。 我希望有一个更有说服力的解决scheme,然后手动检查

 try: error_to_catch = FileNotFoundError except NameError: error_to_catch = IOError 

except error_to_catch

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

因此,只有当一个文件没有被发现,我确实要捕获:

 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