[C++-sig] Letting exception through
nickm at sitius.com
Thu Jul 7 22:27:31 CEST 2005
David Abrahams wrote:
> Nikolay Mladenov <nickm at sitius.com> writes:
> > Hi,
> > I have a python interpreter running as a plugin to at third party
> > software, and I use boost.python to expose some functionality of
> > this software to python.
> Let's see:
> 3rd-party app <----------+
> calls Python interpreter in your plugin |
> which calls a Boost.Python extension module ---+
> (which calls back into the 3rd party app to expose its
That is in principle correct, but because the exposed functionality
UI, there are some additional callbacks crossing the boundary back and
> > I am having the following problem. At times they (the third party
> > software) throw std::exception which they apparently expect to
> > catch,
> > because when boost.python catches it on the boundary between
> > python and C++, the software crashes.
> You conclude that they expect to catch the exception because the
> application crashes at the moment that Boost.Python catches the
> exception? That conclusion seems highly suspect. In general any
> intermediate library should be able to catch an exception and rethrow
> it without the 3rd party app being any the wiser, so if the crash is
> really happening at the catch point, something else is wrong.
I changed the errors.cpp / handle_exception catch block like that:
catch(const std::exception& x)
bool rethrow = false;
PyErr_SetString(PyExc_RuntimeError, "unidentifiable C++
and from the debugger changed the rethrow to true when this particular
exception was handled.
They didn't crash. And it seemed the exception went through python
without a problem?
> > So my question is is there a way to have certain exceptions flow
> > through the boost.python boundary?
> Maybe you could do it by registering a special exception
I have one big problem - the only thing I now about this exception is,
that it is derived from
std::exception, so translator does not seem like an option.
> ... but don't do it; it would be very, very wrong! It will
> certainly crash Python if a C++ exception propagates into it. What
> you need to do, if my picture is right, is translate the exception
> into something that Python can propagate (e.g. by serializing it), and
> then ressurect the exception (e.g. by deserializing it) in your
> plugin, and throw that.
And I have the same problem here. How can I serialize it without knowing
Isn't it always appropriate to rethrow exceptions not coming from your
And following this isn't it better to leave the std::exception out of
handle_exception( one can always register translator) ?
Thanks and regards,
More information about the Cplusplus-sig