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
的别名 ,而FileNotFoundError
是OSError
的子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