IOError和OSError之间的区别?

Nik*_*s R 32 python exception python-2.x

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

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

Mar*_*ers 48

这两种类型之间的差别很小.事实上,即使是核心的Python开发人员也同意IOError在Python 3中没有真正的区别并被删除(现在它是别名OSError).请参阅PEP 3151 - 重新编写OS和IO异常层次结构:

虽然这些区别中的一些可以通过实现考虑来解释,但它们在更高层次上通常不是很合乎逻辑.行分离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'
Run Code Online (Sandbox Code Playgroud)

是的,这是两种不同的异常类型,具有完全相同的错误消息.

对于你自己的代码,坚持投掷OSError.对于现有功能,请查看文档(它应详细说明您需要捕获的内容),但您可以安全地捕获两者:

try:
    # ...
except (IOError, OSError):
    # handle error
Run Code Online (Sandbox Code Playgroud)

再次引用PEP:

事实上,很难想到任何OSError应该被捕获的情况IOError,或者反之亦然.