IOError和OSError之间的区别?

时间:2015-03-30 13:42:14

标签: python exception python-2.x

我总是对函数是否会引发IOError或OSError(或两者兼而有之)感到困惑。这些异常类型背后的原则是什么,它们之间的区别是什么?什么时候引发了什么?

我最初认为OSError适用于权限拒绝,但是打开没有权限的文件会引发IOError。

2 个答案:

答案 0 :(得分:37)

这两种类型之间的差别很小。实际上,即使是核心Python开发人员也同意没有真正的区别,并且在Python 3中删除了IOError(它现在是OSError的别名)。见PEP 3151 - Reworking the OS and IO exception hierarchy

  

虽然其中一些区别可以通过实施考虑来解释,但它们在更高层次上通常不是很合乎逻辑。例如,分隔OSErrorIOError的行通常很模糊。请考虑以下事项:

>>> 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之间没有区别,因为它们主要出现在类似的命令上,例如打开文件或删除文件。