Python:将 errno 映射到 OSError 的子类

标签 python subclass errno oserror

我有一个调用 C 函数的 Python 3 程序。 C 函数返回一个整数:成功时返回 0,失败时返回相应的 errno。失败时,Python 代码可以简单地引发 OSError。但我宁愿它引发 OSError 的适当子类。

例如,如果 Python 程序获得返回码 2,它应该引发 FileNotFoundErrorOSError 的子类。通过执行以下三个步骤,我已经可以找到正确的子类。显然,性能不是问题,因为对于 errno 的所有值,每个 Python 3 版本我只需要执行一次这些步骤,并缓存结果。

  1. 找到OSError 的所有子类。这很容易使用 __subclass__,必要时递归。
  2. 将所有 errno 值映射到名称。例如,如果 errno 为 2,则应映射到 ENOENT。这是通过解析适当的 C 包含文件来完成的。例如,在 FreeBSD 上,该文件将是 /usr/include/errno.h
  3. errno 名称映射到 OSError 子类。这可以通过解析 HTML 代码来完成,例如 http://docs.python.org/release/3.8.2/library/exceptions.html

但是第 3 步真的非常非常虚伪。有没有一种方法可以在不解析文档的情况下执行该步骤?在我本地主机上的 Python 中,有什么我可以以某种方式检查的吗?

最佳答案

当您查看文档时,我相信此翻译是自动完成的。例如,如果您调用:

raise OSError(2, 'this went wrong') # here the 2 corresponds to the error given by C
# raises -> FileNotFoundError: [Errno 2] this went wrong

有关此处使用的确切映射,请转到 page您引用并查看操作系统异常部分。

关于Python:将 errno 映射到 OSError 的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60987155/

相关文章:

python - 如何在不同目录下运行python文件

objective-c - 子类化 CCSprite 的优势

android - onInterceptTouchEvent 的 ViewGroup 子类

c - 单元测试错误条件 - EINTR

c - 如何根据调用的函数使用 errno

python - 类型错误 : "__init__() got multiple values for keyword argument ' name'"

python - 保存并使用 TFIDF 矢量器作为将来的示例,然后导致尺寸错误

python - if 条件中与 unicode 字符串的比较 (python)

ios - 子类化 PFUser 时获得正确的类型

c++ - fread() 无法读取 Dev-Cpp 中的文件数据