Python C API:如何获取异常的字符串表示形式?

12

如果我执行(例如)

 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解释器所显示的字符串?(不需要为每种异常类型构造这样的字符串。)

1个回答

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

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

祝你好运!

更新:我有点困惑,为什么PyErr_Fetch()返回给你的第二个元素是一个字符串。我的猜测是您收到了一个“未规范化的异常”,需要调用PyErr_NormalizeException()将该元组转换为“真正”的异常,以便像您想要的那样格式化自己为字符串。


第二个参数是一个元组而不是字符串。我已经调用了PyErr_NormalizeException()。但是PyErr_Fetch()没有返回异常对象,只有异常类型。那么我需要自己创建异常对象,对吗?我将PyErr_Fetch()的第二个参数传递给构造函数吗? - ashcatch
1
哦,刚刚检查了我的代码,发现我并没有在所有情况下调用PyErr_NormalizeException()。实际上,调用它会将第二个参数转换为异常对象。然后使用PyObject_Str()将其转换为字符串,就能得到我想要的结果。非常感谢。 - ashcatch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接