
"David Abrahams" <dave@boost-consulting.com> wrote in message news:u8y5nt5qs.fsf@boost-consulting.com...
Can it really be two years ago that I talked about refactoring the mechanism in Boost.Python?
http://aspn.activestate.com/ASPN/Mail/Message/boost/1537162
Well, I had to do it for a talk I'm giving, so here it is. It could easily be boost::detail-ized. Is there still interest?
I've implemented similar facilities in Boost.Test. Here is how latest (not cometted)version look like (abridged): namespace detail { class translate_exception_base { public: // Constructor explicit translate_exception_base( boost::scoped_ptr<translate_exception_base>& next ) // Destructor virtual ~translate_exception_base() {} virtual int operator()( unit_test::callback0<int> const& F ) = 0; protected: // Data members boost::scoped_ptr<translate_exception_base> m_next; }; template<typename Exception, typename ExceptionTranslator> class translate_exception : public translate_exception_base { typedef boost::scoped_ptr<translate_exception_base> base_ptr; public: explicit translate_exception( ExceptionTranslator const& tr, base_ptr& next ) : translate_exception_base( next ), m_translator( tr ) {} int operator()( unit_test::callback0<int> const& F ) { try { return m_next ? (*m_next)( F ) : F(); } catch( Exception const& e ) { m_translator( e ); return boost::exit_exception_failure; } } private: // Data members ExceptionTranslator m_translator; }; } class execution_monitor { public: int execute( unit_test::callback0<int> const& F, bool catch_system_errors = true, int timeout = 0 ); // register custom (user supplied) exception translator template<typename Exception, typename ExceptionTranslator> void register_exception_translator( ExceptionTranslator const& tr, boost::type<Exception>* = 0 ); private: // Data members boost::scoped_ptr<detail::translate_exception_base> m_custom_translators; }; // execution_monitor Usage look like this: boost::execution_monitor ex_mon; ex_mon.register_exception_translator<my_exception>( my_translator ); ex_mon.execute( function_to_monitor ); Isn't it what you are trying to do? Gennadiy