Python IOError和OSError之间的区别?

Python IOError和OSError之间的区别?,python,exception,python-2.x,Python,Exception,Python 2.x,我总是对函数是否会引发IOError或OSError(或两者兼而有之)感到困惑。这些异常类型背后的主要规则是什么,它们之间的区别是什么,何时提出 我最初认为OSError是用于拒绝权限之类的东西,但是在没有权限的情况下打开文件会引发IOError。这两种类型之间几乎没有什么区别。事实上,即使是核心Python开发人员也一致认为没有真正的区别,并删除了Python3中的IOError(它现在是OSError的别名)。见: 虽然这些区别中的一些可以用实现方面的考虑来解释,但在更高的层次上,它们往往不

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


我最初认为OSError是用于拒绝权限之类的东西,但是在没有权限的情况下打开文件会引发IOError。

这两种类型之间几乎没有什么区别。事实上,即使是核心Python开发人员也一致认为没有真正的区别,并删除了Python3中的
IOError
(它现在是
OSError
的别名)。见:

虽然这些区别中的一些可以用实现方面的考虑来解释,但在更高的层次上,它们往往不太符合逻辑。例如,分隔
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
,而不是
IOError
,或者相反


IOError和OSError之间没有区别,因为它们大多出现在类似的命令上,如打开文件或删除文件。

在3.3版中更改:
环境错误
IOError
窗口错误
VMSError
套接字.error
select.error
mmap.error
已合并到
OSError
中。例如,只要抛出
OSError
并忘记
IOError
@MartijnPieters谢谢,我已经添加了Python 2标记。只是抛出OSError对我来说听起来不错,但我总是很难知道像
shutil.copyfile()
os.access()
这样的函数何时会引发IOError或OSError(总是要查找它)也可以查看这方面的背景信息,这将有助于透视这两个异常。如果您对此感到困惑,那么,这是切换到Python 3的一个原因。@AnttiHaapala我确实在独立项目中使用Python 3,但在嵌入式Python环境中情况就不同了。:)或者:
除了EnvironmentError:
(这也是PY2上WindowsError、mmap.error、shutil.error等的基类)作为旁白,需要注意的是,问题不是O/s错误和I/O错误之间没有区别,而是Python不一致。对于要引发的I/O错误,Python应该坚持“如果不是因为某些特定于设备或请求的错误,那么操作就会成功。”
try:
    # ...
except (IOError, OSError):
    # handle error