【问题标题】:Difference between IOError and OSError?IOError 和 OSError 的区别?
【发布时间】:2015-03-30 13:42:14
【问题描述】:

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

我最初认为 OSError 是针对诸如权限拒绝之类的事情,但是在没有权限的情况下打开文件会引发 IOError。

【问题讨论】:

  • 在 3.3 版中更改:EnvironmentErrorIOErrorWindowsErrorVMSErrorsocket.errorselect.errormmap.error 已合并到 OSError . 例如只需抛出 OSError 并忘记 IOError
  • @MartijnPieters 谢谢,我已经添加了 Python 2 标记。只是抛出 OSError 对我来说听起来不错,但我总是无法知道像 shutil.copyfile()os.access() 这样的函数何时会引发 IOError 或 OSError(总是需要查找)
  • 另请参阅python.org/dev/peps/pep-3151 了解这方面的背景,这将有助于了解这两个例外情况。
  • 如果您对此感到困惑 - 好吧,这就是切换到 Python 3 的原因之一。
  • @AnttiHaapala 我确实将 Python 3 用于独立项目,但在嵌入式 Python 环境中却是另一回事。 :)

标签: python exception python-2.x


【解决方案1】:

这两种类型之间几乎没有区别。事实上,即使是核心 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,或者相反。

【讨论】:

  • 或:except EnvironmentError:(在 PY2 上也是 WindowsError、mmap.error、shutil.Error 等的基类)
  • 顺便说一句,重要的是要注意问题不在于 O/S 错误和 I/O 错误之间没有区别,而是 Python 不一致。对于要引发的 I/O 错误,Python 应该坚持“如果不是因为某些错误,特定于设备或请求,操作就会成功。”
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 2013-08-07
    • 2011-10-20
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 2010-12-21
    相关资源
    最近更新 更多