6

I have been working on a project where I want to remove the boost dependencies and replace it with the Python C API.

I spent some time understanding the Python C API and I saw this catch (error_already_set const &)

I read the boost docs but it explains where it is used. But I want to know why it is needed and how can I achieve the same functionality using the native Python C api.

NVS Abhilash
  • 574
  • 7
  • 24
  • 2
    [This blog](https://misspent.wordpress.com/2009/10/11/boost-python-and-handling-python-exceptions/) explains the meaning of `error_already_set` and how you can figure out what actually happened on the Python side. – luator Mar 23 '18 at 10:54

1 Answers1

8

Boost throws error_already_set when a Python error has occurred. So if you see code like this:

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

you'll replace it with:

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

In other words, wherever you see catch(error_already_set), there you will likely want to do some error handling using whatever PyObject* or other value is involved to recognize when an error has occurred (and therefore you can examine the traceback, or convert it into a C++ exception).

John Zwinck
  • 239,568
  • 38
  • 324
  • 436