IOError 和 OSError 的区别?

Difference between IOError and OSError?

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

我最初认为 OSError 是为了拒绝权限之类的事情,但打开没有权限的文件会引发 IOError。

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

While some of these distinctions can be explained by implementation considerations, they are often not very logical at a higher level. The line separating OSError and IOError, for example, is often blurry. Consider the following:

>>> 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:

In fact, it is hard to think of any situation where OSError should be caught but not IOError, or the reverse.

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