Boost.python 中的 error_already_set 做什么以及如何在 Python C API 中类似地处理异常
What does error_already_set in Boost.python do and how to handle exceptions similarly in Python C API
我一直在做一个项目,我想删除 boost 依赖项并将其替换为 Python C API。
我花了一些时间了解 Python C API 我看到了这个
catch (error_already_set const &)
我阅读了 boost 文档,但它解释了它的使用位置。但我想知道为什么需要它以及如何使用本机 Python C api.
实现相同的功能
当发生 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++ 异常)。
我一直在做一个项目,我想删除 boost 依赖项并将其替换为 Python C API。
我花了一些时间了解 Python C API 我看到了这个
catch (error_already_set const &)
我阅读了 boost 文档,但它解释了它的使用位置。但我想知道为什么需要它以及如何使用本机 Python C api.
实现相同的功能当发生 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++ 异常)。