Boost logo

Boost :

From: Rozental, Gennadiy (gennadiy.rozental_at_[hidden])
Date: 2003-02-14 14:46:37


> > I could do something along following lines:
> >
> > #include <iostream>
> > using namespace std;
> >
> > void
> > unknown_exception_handler()
> > {
> > try {
> > throw;
> > }
> > catch( int i ) {
> > cout << "int caught\n";
> > }
> > }
> >
> >
> > int main()
> > {
> > try {
> > throw 1;
> > }
> > catch( ... ) {
> > try {
> > unknown_exception_handler();
> > } catch( ... ) {
> > cout << "unknown exception\n";
> > }
> > }
> > }
> >
> > and provide a way to configure unknown_exception_handler.
> > Dave, do you have something different in mind?
>
> Yes; check out
> http://www.boost.org/libs/python/doc/v2/exception_translator.html
>
> This allows multiple independently registered exception handlers.
> Whether or not that's overkill for your purposes is another matter.

If I understand the code properly, you proposing something along the
following lines:

struct exception_handler {
    exception_handler( exception_handler* next = 0 ) : m_next( next ) {}
    virtual ~exception_handler() {}

    virtual void run( test_case, test_case_method ) = 0;

    boost::scoped_ptr<exception_handler> m_next;
};

template<typename Exception, typename Translator>
struct concreate_exception_handler :
{
    concreate_exception_handler( Translator tr, exception_handler next = 0 )
    : exception_handler( next ), m_translator( tr ) {}

    virtual void run( test_case, test_case_method )
    {
        try {
            if( m_next )
                 m_next->run( test_case, test_case_method );
            else
                 test_case->*test_case_method();
           }
        catch(Exception const& e) {
            m_translator( e );
        }
    }

    Translator m_translator;
};
 

Now unit test monitor could have member boost::scoped_ptr<exception_handler>
m_eh and following logic

a) in function
if( m_eh )
   m_eh->handle( test_case, method );
else
   test_case->*method()

b) add somehow register method

template<typename Exception, typename Translator>
void register_exception_handler( Translator tr )
{
    m_eh = new concreate_exception_handler<Exception,Translator>( m_eh );
}

It seems a little bit too complex in comparison with my solution, though
implementable.

> note however that the try { throw; } idiom breaks on many popular
> compilers that are still in use, which is why my code doesn't use it.

What standard says about it?
I just checked. MSVC6, bcc 5.5.1, gcc 2.95, gcc 3.2, SunPro 4.2 works as
expected. What compilers do I really need to bother about?

Gennadiy.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk