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 之间没有区别,因为它们大多出现在类似的命令中,例如打开文件或删除文件。
我总是对函数是否会引发 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
andIOError
, 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 notIOError
, or the reverse.
IOError 和 OSError 之间没有区别,因为它们大多出现在类似的命令中,例如打开文件或删除文件。