0

我有一些使用 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

1 回答 1

4

当然,我在制定并发布此问题后立即找到了解决方案。

这段代码终于成功了,并提供了很好的消息:

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 也知之甚少。

于 2018-03-23T14:29:41.773 回答