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

12 投票
1 回答
5259 浏览
提问于 2025-04-15 12:16

如果我在Python中执行(例如)

 open("/snafu/fnord")

而这个文件不存在,我会收到一个错误追踪信息和一条消息

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

我想通过Python的C接口获取上面的字符串(也就是说,在一个C程序中嵌入Python解释器)。我需要的是字符串,而不是输出到控制台。

通过PyErr_Fetch(),我可以获取异常的类型对象和它的值。对于上面的例子,值是一个元组:

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

有没有简单的方法可以从我通过PyErr_Fetch()获得的信息中得到Python解释器显示的字符串?(一种不需要自己为每种异常类型构造这样的字符串的方法。)

1 个回答

9

我觉得Python中的异常是通过对异常实例运行“str()”函数来打印的,这样会返回你想要的格式化字符串。你可以通过在C语言中调用PyObject_Str()这个方法来获取这个字符串,具体内容可以在这里找到:

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

祝你好运!

更新:我有点困惑,为什么PyErr_Fetch()返回的第二个元素是一个字符串。我的猜测是你得到了一个“未标准化的异常”,你需要调用PyErr_NormalizeException()来把那个元组转换成一个“真正的”异常,这样它就可以像你想要的那样格式化成字符串。

撰写回答