【问题标题】:Python: map errno to subclass of OSErrorPython:将 errno 映射到 OSError 的子类
【发布时间】:2020-07-14 03:54:58
【问题描述】:

我有一个调用 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 中以某种方式检查一些东西吗?

【问题讨论】:

    标签: python subclass errno oserror


    【解决方案1】:

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

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

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

    【讨论】:

    • 你的想法是正确的,我不敢相信我什至没有先尝试过!有趣的是,它仅在包含第二个参数字符串时才使用子类;字符串可能为空。
    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多