سؤال

في أداة التدمير، هل هناك طريقة لتحديد ما إذا كان الاستثناء قيد المعالجة حاليًا؟

هل كانت مفيدة؟

المحلول

يمكنك استخدام std::uncaught_exception()، لكنها قد لا تفعل ما تعتقد أنها تفعله:يرى جوتو رقم 47 للمزيد من المعلومات.

نصائح أخرى

كما قال لوك، يمكنك استخدام std::uncaught_exception().ولكن لماذا تريد أن تعرف؟على أي حال، يجب على المدمرين ألا يرميوا استثناءات أبدًا!

يمكنك استخدام ال تعزيز مكتبة الاختبار.انظر هنا للحصول على مثال صغير:

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

عليك أن تحفر في الوثائق.إنها مكتبة قوية جدًا لاختبار برامجك!على أي حال، بمساعدة Boost، يمكنك التقاط أي نوع من الاستثناءات التي يتم تشغيلها في أي مكان في اختبار الوظيفة الخاص بك!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top