Boost.python中的error_already_set做了什么以及如何在Python C API中处理异常

时间:2017-03-29 12:49:02

标签: python c++ exception-handling boost-python python-c-api

我一直致力于一个项目,我想删除boost依赖项并将其替换为Python C API。

我花了一些时间来理解Python C API,我看到了这一点 catch (error_already_set const &)

我阅读了增强文档,但它解释了它的使用位置。但我想知道为什么需要它,如何使用原生Python C api实现相同的功能。

1 个答案:

答案 0 :(得分:4)

发生Python错误时,

Boost抛出error_already_set。所以如果你看到这样的代码:

try {
    bp::exec(bp::str("garbage code is garbage"));
} catch (const bp::error_already_set&) {
    // your code here to examine Python traceback etc.
}

你将替换为:

your_ptr<PyObject> res = PyRun_String("garbage code is garbage");
if (!res) {
    // your code here to examine Python traceback etc.
}

换句话说,无论您在哪里看到catch(error_already_set),您都可能希望使用PyObject*或其他值来进行错误处理以识别错误发生的时间(因此您可以检查回溯,或将其转换为C ++异常。)