提问人:sbi 提问时间:3/23/2018 最后编辑:sbi 更新时间:3/26/2018 访问量:1108
如何通过 C API 从 Python 3 异常中提取字符串
How to extract a string from a Python 3 exception via the C API
问:
我有一些使用 Boost.Python 运行 Python 3 代码的 C++ 代码。如果 Python 中发生任何异常,则会捕获该异常并引发 C++ 异常。我想将一些最小的错误信息传递给 C++ 异常。
我目前拥有的是:
try {
// execute python code via Boost.Python
} catch(boost::python::error_already_set&) {
PyObject *ptype, *pvalue, *ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback);
if(pvalue) {
// ???
}
}
SO 有很多有用的答案,但它们似乎都适用于 Python 2,它们的解决方案不再有效。我尝试过一些类似 , , 但我得到的只是空指针。PyBytes_AsString
PyUnicode_AsUTF8
我该如何从中提取有意义的东西?对于初学者来说,引发的异常的类型名称已经很有帮助了。如果有一个字符串传递给异常,获取它将是最有帮助的。pvalue
答:
4赞
sbi
3/23/2018
#1
当然,在我制定并发布这个问题后,我自己立即找到了解决方案。
这段代码终于奏效了,并提供了很好的信息:
try {
// execute python code via Boost.Python
} catch(boost::python::error_already_set&) {
PyObject *ptype, *pvalue, *ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback);
if(pvalue) {
PyObject *pstr = PyObject_Str(pvalue);
if(pstr) {
const char* err_msg = PyUnicode_AsUTF8(pstr);
if(pstr)
// use err_msg
}
PyErr_Restore(ptype, pvalue, ptraceback);
}
}
不过,我很高兴有任何反馈。我对 Python 知之甚少,对它的 C API 也知之甚少。
评论
0赞
Jiminion
1/25/2019
PyObject_Str() 创建一个新引用。我正在尝试做同样的事情,但使用 PyBytes_AsString()
上一个:枚举值的编译时列表
下一个:搜索用于自组织和同步的协议
评论