2008-09-24 7 views
1

소멸자에서 예외가 현재 처리되고 있는지 확인하는 방법이 있습니까?예외가 발생하는지 확인하는 방법이 있습니까?

+0

의심스러운 냄새가납니다. 예외가 발생한 경우 왜 다른 종류의 정리를 원하겠습니까? – Pramod

+0

동의했다. 그리고 당신은 소멸자 IMO를 버리고 싶지 않습니다. 하지만 소멸자로부터 던질 수는 있지만 예외가 전파되는 동안 소멸자가 던져 버리면 종료됩니다 (종료 또는 정상 정리없이) –

답변

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

+0

제안 : '코드 샘플'형식 (답변 편집기에서 1과 0 버튼)을 사용하면 코드 예제를 훨씬 쉽게 읽을 수 있습니다. 그것을 감싼다. – jwfearn

2

Luc이 말한 것처럼 std :: uncaught_exception()을 사용할 수 있습니다. 그런데 왜 알고 싶니? 어쨌든 destructors should never throw exceptions!

+0

예, 이미 unwinding 할 때 던지지 않음으로써 terminate()에서 끝내지 않도록 시도하는 냄새가납니다. –

관련 문제