Pregunta

En un destructor, ¿hay alguna manera de determinar si actualmente se está procesando una excepción?

¿Fue útil?

Solución

Puedes usar std::uncaught_exception(), pero es posible que no haga lo que crees:ver GoTW#47 para más información.

Otros consejos

Como dijo Luc, puedes usar std::uncaught_exception().¿Pero por qué quieres saberlo?En todo caso, los destructores nunca deberían lanzar excepciones!

Puedes usar el Biblioteca de pruebas de impulso.Mire aquí un pequeño ejemplo:

struct my_exception1
{
    explicit    my_exception1( int res_code ) : m_res_code( res_code ) {}
    int         m_res_code;
};


struct my_exception2
{
    explicit    my_exception2( int res_code ) : m_res_code( res_code ) {}
    int         m_res_code;
};

class dangerous_call {
public:
    dangerous_call( int argc ) : m_argc( argc ) {}
    int operator()()
    {
        if( m_argc < 2 )
            throw my_exception1( 23 );
        if( m_argc > 3 )
            throw my_exception2( 45 );
        else if( m_argc > 2 )
            throw "too many args";

        return 1;
    }

private:
    int     m_argc;
};


void translate_my_exception1( my_exception1 const& ex )
{
    std::cout << "Caught my_exception1(" << ex.m_res_code << ")"<< std::endl;
}


void translate_my_exception2( my_exception2 const& ex )
{
    std::cout << "Caught my_exception2(" << ex.m_res_code << ")"<< std::endl;
}



int 
cpp_main( int argc , char *[] )
{ 
    ::boost::execution_monitor ex_mon;
    ex_mon.register_exception_translator<my_exception1>(
        &translate_my_exception1);
    ex_mon.register_exception_translator<my_exception2>(
        &translate_my_exception2);
    try{
     // ex_mon.detect_memory_leak( true);
      ex_mon.execute( ::boost::unit_test::callback0<int>( 
          dangerous_call( argc ) ) );
    }   
    catch ( boost::execution_exception const& ex ) {
        std::cout << "Caught exception: " << ex.what() << std::endl;
    }
    return 0;
}

Tienes que profundizar en la documentación.¡Es una biblioteca muy poderosa para probar su software!De todos modos, con la ayuda de Boost puedes detectar cualquier tipo de excepción activada en cualquier parte de tu prueba de función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top