2008-09-24 7 views
1

В деструкторе существует ли способ определить, обрабатывается ли какое-либо исключение?Есть ли способ определить, произошло ли исключение?

+0

Это пахнет подозрительным. Зачем вам нужен другой вид очистки, если произошло исключение? – Pramod 2008-09-24 12:59:09

+0

Согласованные Подозрительные. И вы никогда не захотите выбрасывать из деструктора ИМО. Но вы можете выбросить деструктор, но если вы выбросите деструктор, а другое исключение распространится, приложение прекратит работу (без выхода или нормальной очистки). – 2008-09-24 15:06:40

ответ

7

Вы можете использовать std :: uncaught_exception(), но он может не делать то, что вы думаете, что он делает: см. GoTW#47 для получения дополнительной информации.

0

Вы можете использовать Boost Test Library. Вот небольшой пример:

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 вы можете поймать любое исключение, которое будет храниться в любом месте вашего тестового теста!

+0

Конечно, ваша тестовая функция может находиться внутри структуры, где вы перегружаете оператор() ... и там вы можете поместить свой тест, чтобы узнать, какое сгенерировано исключение. – Eddie 2008-09-24 13:03:15