Python: 将 errno 映射到 OSError 的子类
Python: map errno to subclass of OSError
我有一个 Python 3 调用 C 函数的程序。 C 函数 return 是一个整数:成功时为 0,失败时为适当的 errno
。失败时,Python 代码可以简单地引发 OSError
。但我宁愿它引发 OSError
.
的适当子类
例如,如果Python程序得到2的return代码,它应该引发FileNotFoundError
,OSError
的一个子类。通过执行以下三个步骤,我已经可以找到正确的子类。显然,性能不是问题,因为对于 errno
的所有值,每个 Python 3 版本我只需要执行一次这些步骤,并缓存结果。
- 找到
OSError
的所有子类。这很容易使用 __subclass__
,必要时递归。
- 将所有
errno
值映射到名称。例如,如果 errno
为 2,则应映射到 ENOENT
。这是通过解析适当的 C 包含文件来完成的。例如,在 FreeBSD 上,该文件将是 /usr/include/errno.h
.
- 将
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 并查看 OS 例外部分。
我有一个 Python 3 调用 C 函数的程序。 C 函数 return 是一个整数:成功时为 0,失败时为适当的 errno
。失败时,Python 代码可以简单地引发 OSError
。但我宁愿它引发 OSError
.
例如,如果Python程序得到2的return代码,它应该引发FileNotFoundError
,OSError
的一个子类。通过执行以下三个步骤,我已经可以找到正确的子类。显然,性能不是问题,因为对于 errno
的所有值,每个 Python 3 版本我只需要执行一次这些步骤,并缓存结果。
- 找到
OSError
的所有子类。这很容易使用__subclass__
,必要时递归。 - 将所有
errno
值映射到名称。例如,如果errno
为 2,则应映射到ENOENT
。这是通过解析适当的 C 包含文件来完成的。例如,在 FreeBSD 上,该文件将是/usr/include/errno.h
. - 将
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 并查看 OS 例外部分。