我总是对函数是否会引发IOError或OSError(或两者兼而有之)感到困惑。这些异常类型背后的原则是什么,它们之间的区别是什么?什么时候引发了什么?
我最初认为OSError适用于权限拒绝,但是打开没有权限的文件会引发IOError。
答案 0 :(得分:37)
这两种类型之间的差别很小。实际上,即使是核心Python开发人员也同意没有真正的区别,并且在Python 3中删除了IOError
(它现在是OSError
的别名)。见PEP 3151 - Reworking the OS and IO exception hierarchy:
虽然其中一些区别可以通过实施考虑来解释,但它们在更高层次上通常不是很合乎逻辑。例如,分隔
OSError
和IOError
的行通常很模糊。请考虑以下事项:>>> os.remove("fff") Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [Errno 2] No such file or directory: 'fff' >>> open("fff") Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'fff'
是的,这是两种不同的异常类型,完全相同的错误消息。
对于您自己的代码,请坚持投掷OSError
。对于现有函数,请查看文档(它应详细说明您需要捕获的内容),但您可以安全地捕获这两个函数:
try:
# ...
except (IOError, OSError):
# handle error
再次引用PEP:
事实上,很难想到应该抓住
OSError
而不是IOError
的任何情况,或者相反。
答案 1 :(得分:0)
IOError和OSError之间没有区别,因为它们主要出现在类似的命令上,例如打开文件或删除文件。