소멸자에서 예외가 현재 처리되고 있는지 확인하는 방법이 있습니까?예외가 발생하는지 확인하는 방법이 있습니까?
1
A
답변
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를 사용하면 함수 테스트에서 어디서나 예외를 잡을 수 있습니다!
2
Luc이 말한 것처럼 std :: uncaught_exception()을 사용할 수 있습니다. 그런데 왜 알고 싶니? 어쨌든 destructors should never throw exceptions!
+0
예, 이미 unwinding 할 때 던지지 않음으로써 terminate()에서 끝내지 않도록 시도하는 냄새가납니다. –
관련 문제
- 1. MFC에서 어떤 두 번째 이벤트가 발생하는지 확인하는 방법이 있습니까
- 2. 클래스에서 어떤 종류의 예외가 발생하는지 어떻게 알 수 있습니까?
- 3. 어디에서 자바 웹 시작 앱에서 예외가 발생하는지 확인할 수 있습니까?
- 4. ExternalInterface.call의 출처를 확인하는 방법이 있습니까?
- 5. 방법이 예외가 발생 NAudio
- 6. 시스템 경로가 잘못되었을 때 예외가 발생하는지 테스트하려면 어떻게합니까?
- 7. Simulink의 버스에서 신호가 발생하는지 확인
- 8. 사용자가 현재 유휴 상태인지 확인하는 방법이 있습니까?
- 9. 함수가 unittest에서 실행되는지 여부를 확인하는 방법이 있습니까?
- 10. win32 세마포어의 현재 카운트를 확인하는 방법이 있습니까?
- 11. 사용자가 JQuery를 사용하여 로그인했는지 확인하는 방법이 있습니까?
- 12. 변수가 집합에 속하는지 확인하는 빠른 방법이 있습니까?
- 13. 컬을 사용하여 클라이언트를 확인하는 방법이 있습니까?
- 14. 내 프록시가 온라인 상태인지 확인하는 방법이 있습니까?
- 15. 쿠키가 PHP에서 httponly인지 확인하는 방법이 있습니까
- 16. ejabberd : 사용자가 관리자인지 확인하는 방법이 있습니까?
- 17. Linux PID가 일시 중지되었는지 확인하는 방법이 있습니까?
- 18. JDBC 트랜잭션이 유효한지 확인하는 방법이 있습니까?
- 19. Facebook : 특정 권한이 있는지 확인하는 방법이 있습니까?
- 20. 노래가 iPhone에 있는지 확인하는 방법이 있습니까?
- 21. Linux에서 컨텍스트 스위치의 원인을 확인하는 방법이 있습니까?
- 22. JavaScript에서 변수가 날짜인지 확인하는 방법이 있습니까?
- 23. ColdFusion 이메일 - 이메일이 전송되었는지 확인하는 방법이 있습니까?
- 24. 함수가 컴파일 된 JIT인지 확인하는 방법이 있습니까?
- 25. 복제 기사가 올바른지 확인하는 쉬운 방법이 있습니까?
- 26. (Rails) 필드의 데이터 유형을 확인하는 방법이 있습니까?
- 27. Silverlight의 DataGrid에 포커스가 있는지 확인하는 방법이 있습니까?
- 28. PHP가 JS에서만로드되고 있는지 확인하는 방법이 있습니까?
- 29. 문자열이 유효한 xpath인지 확인하는 방법이 있습니까?
- 30. 포인터가 매달려 있는지 확인하는 방법이 있습니까?
의심스러운 냄새가납니다. 예외가 발생한 경우 왜 다른 종류의 정리를 원하겠습니까? – Pramod
동의했다. 그리고 당신은 소멸자 IMO를 버리고 싶지 않습니다. 하지만 소멸자로부터 던질 수는 있지만 예외가 전파되는 동안 소멸자가 던져 버리면 종료됩니다 (종료 또는 정상 정리없이) –