【问题标题】:Python C API: how to get string representation of exception?Python C API:如何获取异常的字符串表示?
【发布时间】:2010-11-03 07:50:09
【问题描述】:

如果我这样做(例如)

 open("/snafu/fnord")

在 Python 中(并且该文件不存在),我得到一个回溯和消息

 IOError: [Errno 2] No such file or directory: '/snafu/fnord'

我想用 Python 的 C API(即嵌入在 C 程序中的 Python 解释器)获取上述字符串。我需要它作为字符串,而不是输出到控制台。

使用PyErr_Fetch()我可以得到异常的类型对象和值。对于上面的例子,值是一个元组:

 (2, 'No such file or directory', '/snafu/fnord')

PyErr_Fetch() 获得的信息到 Python 解释器显示的字符串是否有简单的方法? (不涉及自己为每种异常类型构造此类字符串。)

【问题讨论】:

    标签: python exception python-c-api


    【解决方案1】:

    我认为 Python 异常是通过在异常实例上运行“str()”来打印的,这将返回您感兴趣的格式化字符串。您可以通过调用此处描述的 PyObject_Str() 方法从 C 中获取此信息:

    https://docs.python.org/c-api/object.html

    祝你好运!

    更新:我有点困惑,为什么 PyErr_Fetch() 返回给您的第二个元素是一个字符串。我的猜测是您收到“非规范化异常”,需要调用 PyErr_NormalizeException() 将该元组转换为“真实”异常,该异常可以按照您的意愿将自身格式化为字符串。

    【讨论】:

    • 第二个参数是一个元组而不是一个字符串。我已经调用了 PyErr_NormalizeException()。但是 PyErr_Fetch() 不返回异常对象,只返回异常类型。所以我想我必须自己创建异常对象?我将 PyErr_Fetch() 的第二个参数传递给构造函数?
    • 哦,刚刚检查了我的代码,我并没有在所有情况下都调用 PyErr_NormalizeException()。调用它,确实将第二个参数变成了一个异常对象。并使用 PyObject_Str() 将其转换为字符串可以获得我想要的结果。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2023-03-10
    • 1970-01-01
    • 2012-11-26
    • 2015-08-16
    相关资源
    最近更新 更多