[C++-sig] First pass at exception translator template

Gavin Doughtie gdoughtie at anim.dreamworks.com
Tue Jun 3 01:30:00 CEST 2003


So, this is probably gross or non thread-safe in some manner that I'm 
not clued into yet. I'd appreciate any elegant refactorings, but this 
seems to work and will allow me to just specify a bunch of 
"REGISTER_EXCEPTION" lines in my module.

--------8<-------------------------------
template <typename ExceptionType>
struct ExceptionTranslator
{
   typedef ExceptionTranslator<ExceptionType> type;

   static PyObject *pyException;

   static void RegisterExceptionTranslator(scope & scope, const char* 
moduleName, const char* name)
   {
     // Add the exception to the module scope
     std::strstream exName;
     exName << moduleName << "." << name << '\0';
     pyException = PyErr_NewException(exName.str(), NULL, NULL);
     handle<> instanceException(pyException);
     scope.attr(name) = object(instanceException);

     // Register a translator for the type
     register_exception_translator< ExceptionType >
       (
        &ExceptionTranslator<ExceptionType>::translateException
        );
   }

   static void translateException(const ExceptionType& ex)
   {
     PyErr_SetString(pyException, ex.getMessage().ptr());
   }
};

template<typename ExceptionType>
PyObject* ExceptionTranslator<ExceptionType>::pyException;

// Convenience macro
#define REGISTER_EXCEPTION(scopeRef, moduleName, className) \
ExceptionTranslator<className>::RegisterExceptionTranslator(scopeRef, 
moduleName, #className)


// Module 
======================================================================
BOOST_PYTHON_MODULE(my_module)
{

   scope moduleScope;

   REGISTER_EXCEPTION(moduleScope, "my_module", InstanceException);

.....
}

-- 
Gavin Doughtie
DreamWorks SKG






More information about the Cplusplus-sig mailing list