3

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

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

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

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

4

1 回答 1

1

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

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

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

于 2020-04-02T08:38:08.830 回答