[C++-sig] Re: Wrapper for exception translation

David Abrahams dave at boost-consulting.com
Thu Jul 10 15:27:20 CEST 2003


Gottfried.Ganssauge at HAUFE.DE writes:

> Currently, in order to wrap user defined exceptions you need to
>
> - allocate a python exception using PyErr_NewException

Well, no.  I don't see any call to PyErr_NewException in
libs/python/test/exception_translator.cpp

>   This function needs to be parametrized using a specific naming
>   convention

It's not clear to me what you're referring to.  Are you sure you mean
"naming convention"?

>   you also need to find a place where this exception instance lives
>   and is accessible to the exception translator

I don't know what you mean here.  For one thing, first "this" is a
function and now "this" is an exception instance.

> - define an exception translator which signals the exception defined
> above

What do you mean by "define an exception translator"?
What do you mean by "signals the exception"?

> - register the exception translator with the library

This I understand to mean something like:

     register_exception_translator<error>(&translate);

> My facility allows to do this with only one function call
> "exception_<Exception type> (name)" within the module init function.
> It will allocate a python exception 

Do you mean it will create a Python subclass of Exception?  Or is it
something else?  I guess the docs for PyErr_NewException are a little
unclear on this point, but I think it's what I said.

> and store it within an instance of the
> translated_exception_handler<> class. The name for that exception is
> taken from the name parameter and the current scope according to the
> naming convention documented in the manual page for
> PyErr_NewException.  

Hmm, I didn't know about PyErr_NewException, but it looks useful.

> A reference to the translated_exception_handler is stored within the
> class dictionary of the newly allocated python exception in order to
> keep the translator alive.  The translated_exception_handler
> provides the exception translator to be registered with the
> library. 

OK, OK, wait.  I was beginning to like where this was going, (I like
what you're accomplishing) but this all sounds *way* too complex for
that purpose.  Especially the "creation of an anonymous class" that
you do in the code here looks like a messy hack likely to break at
some point.  Why is such a complicated mechanism needed?

> It uses a generic method to obtain an exception description
> by calling a function get_exception_description<>() which has a
> default implementation in the detail namespace.  Finally the python
> exception itself is made available in the module's namespace under
> the name given.
>
> get_exception_description<>() currently returns a const char * which
> is passed to PyErr_SetString(). It might be worthwile to make it
> return an object which then could be passed to
> PyErr_SetObject(). This modification would make it possible to pass
> an instance of a class which wraps the exception caught, which again
> would make the exception instance itself available to python
> programs.
>
> Another enhancement could be the generation of derived python
> exceptions, an area in which I have no experience yet. This could be
> by an additional template parameter to the exception_<>() function
> which defaults to the allocation with PyErr_NewException().
>
> What do you think?

I think I understand this much:

  your code provides the ability to easily define new Python
  exception types corresponding to particular C++ exception types.

Bravo to that; I'd like to get this capability into the library.

I do think the implementation is needlessly convoluted.  Just by
inspection it looks to me like you make heavy use of a dictionary 

        // class dictionary for the new exception class
        dict d;

which later simply goes out of scope.  What's the point of that?
Have I missed something?

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com





More information about the Cplusplus-sig mailing list