Question

Dans un destructeur, existe-t-il un moyen de déterminer si une exception est en cours de traitement?

Était-ce utile?

La solution

Vous pouvez utiliser std :: uncaught_exception (), mais il se peut qu'il ne fasse pas ce que vous pensez: voir GoTW # 47 pour plus d'informations.

Autres conseils

Comme Luc l'a dit, vous pouvez utiliser std :: uncaught_exception (). Mais pourquoi veux-tu savoir? Dans tous les cas, les destructeurs ne doivent jamais lancer d'exceptions !

Vous pouvez utiliser la Bibliothèque de tests Boost . Regardez ici pour un petit exemple:

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;
}

Vous devez creuser dans la documentation. C'est une bibliothèque très puissante pour tester votre logiciel! Quoi qu’il en soit, avec l’aide de Boost, vous pouvez détecter tout type d’exception déclenchée n’importe où dans votre test de fonctionnement!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top