Python 3中IOError是OSError的别名,所有I/O系统错误均统一为OSError及其子类,如FileNotFoundError、PermissionError等,推荐优先捕获具体子类以实现更精确的异常处理。

在 Python 中,IOError 和 OSError 都用于处理操作系统级别的错误,但它们的关系随着 Python 版本的演进而发生了变化。
Python 2 中的 IOError 与 OSError
在 Python 2 中,IOError 和 OSError 是两个独立的异常类,都继承自 EnvironmentError。它们分别用于表示不同类型的系统错误:
- IOError:通常与输入输出操作有关,比如文件无法打开、读取或写入失败。
- OSError:更广泛地表示操作系统相关的错误,如系统调用失败、权限问题、进程创建失败等。
虽然用途略有不同,但在实际使用中两者经常重叠。例如,尝试打开一个不存在的文件会触发 IOError,而这个错误本质上是操作系统返回的错误码(如 ENOENT)。
Python 3 中的统一:IOError 是 OSError 的别名
从 Python 3 开始,语言设计者对异常体系进行了简化和统一。在这个版本中:
立即学习“Python免费学习笔记(深入)”;
- IOError 被保留为 OSError 的一个别名。
- 所有原本在 Python 2 中抛出 IOError 的地方,在 Python 3 中都会直接抛出 OSError 或其子类。
这意味着下面的代码在 Python 3 中是等价的:
与 ECShop 不同的是,ECMall 是一个允许店铺加盟的多店系统。它不仅可以帮助众多成熟的网络社区实现社区电子商务还可以推进各种地域性、垂直性明显的门户网站的电子商务进程。 ECMall是一个根据融合了电子商务以及网络社区特色的产品,它不仅能使您的电子商务进程变得异常轻松,同时通过和康盛创想相关产品的结合还能进一步提高用户的活跃度以及黏性,从而促进用户的忠诚度。 ECMall 2.3.0 正
try:
open('nonexistent.txt')
except OSError:
print("捕获到 OSError")
try:
open('nonexistent.txt')
except IOError:
print("捕获到 IOError") # 这也能捕获,因为 IOError 就是 OSError
实际上,IOError is OSError 在 Python 3 中返回 True。
更细粒度的异常子类
Python 3 还引入了 OSError 的多个具体子类,如:
- FileNotFoundError:文件未找到(取代旧的 IOError with errno.ENOENT)
- PermissionError:权限不足
- FileExistsError:文件已存在
- NotADirectoryError、IsADirectoryError 等
这些子类让异常处理更加精确。推荐在 Python 3 中优先捕获这些具体异常,而不是笼统地使用 OSError 或 IOError。
基本上就这些。在现代 Python(3.x)开发中,你应该主要使用 OSError 及其子类来处理系统级 I/O 错误,而 IOError 仅作为兼容性存在,不建议主动抛出或依赖。了解这一演变有助于写出更清晰、兼容性更好的代码。









