2010-08-23 4 views
0

terminate_handler에서 정리를하고 예외를 throw 할 수 있습니다. terminate_handler에 대한 재귀 호출을 막기 위해 catch하는 것에 대해 걱정할 필요가 있습니까? gcc를 사용하면 이런 일이 발생할 수없는 것 같아 중단하기 만하면됩니다. 표준에 맞습니까? 아니면 정의되지 않은 동작입니까?terminate_handler를 두 번 입력 할 수 있습니까?

+0

나는이 답변으로 도움이 될 것이라고 생각하지 않지만, 그냥이 시간 동안 예외를 던질 수있는 아무것도 할 수 있습니까? –

+0

terminate_handler에서 일부 로깅 버퍼를 소비하는 것을 끝내려고합니다. 프로그램이 종료되는 한 로깅 버퍼에서 무엇을 얻을 수 있는지 알 수 있습니다. 실패하면 실패하지만 왜 시도하지 않습니까? 로거가 던지기 시작한 국가에 들어갔다면 커다란 후퇴에 대해 걱정했습니다. –

답변

4

종료 처리기는 이 아니며 돌아올 수있는이 아닙니다 (18.6. 3.1/2). 프로그램을 종료해야합니다 (기본 처리기는 abort()을 호출합니다). 이 구성 경우

void my_terminate() 
{ 
    throw 5; 
} 

프로그램을 종료하지 않고 (예외가 전파 때문에) 기능을 떠날 것이기 때문에 당신은 정의되지 않은 동작을 얻을 것입니다. 당신이 던질 수있는 코드가있는 경우, 확인 그래서이 같은 모든 예외를 잡을 :

void my_terminate() 
{ 
    try 
    { 
     // stuff 
    } 
    catch(...) 
    { 
     // too bad 
    } 

    abort(); 
} 

을하지만 (제목 질문에 대답하기), 내가 다시 입력되는 것을 제한 아무것도 표시되지 않기 때문에 이 기술적으로 괜찮을해야합니다

void my_terminate() 
{ 
    static int counter = 0; 

    if (counter++ < 5) 
     terminate(); 

    abort(); 
} 
+0

'std :: terminate' - 아마도 유일한 곳인'catch (...)'는 괜찮습니다. +1 –

1

아니요, 일반 프로그램 흐름을 std::terminate에서 재개 할 수 없습니다. 그러나 , unexpected 함수에서 다른 예외를 throw합니다. Terminate 그냥 완료 - 프로그램 실행이 완료되면 종료됩니다.

편집 :

, 당신은 std::terminate에서 복잡한 아무것도하지 않아야 말했다

- 당신이 terminate 다음 일을 계속하려고해서는 안 충분히 폭파 한에 있다면 - 당신은 shouldn 동일한 이유로 std::terminate에 메모리를 할당하는 것과 같은 일을하려고하지 마십시오. 낮은 메모리 조건의 결과로 프로그램이있는 경우에는 어떻게해야합니까? 거기에 대해 할 수있는 일은 없습니다.

+0

나는 정상적인 프로그램 흐름을 재개하고 싶지 않다. 내 처리기는 다음과 같이 보일 것입니다. void myTerminate() {logger.consumeAll(); }. 거기에있는 것을 기록하기위한 마지막 도랑 시도입니다. Logger :: consumeAll이 throw되면 어떻게되는지 궁금합니다. –

+0

@Pythonic : 예, 나는 단지 내가 의미하는 바를 설명하는 나쁜 일을하고 있습니다. 그것이 GMan이 말했듯이, 당신이하는 일이면, 당신은 정의되지 않은 행동을합니다. –

+0

@ pythonic : 아, 정상적인 프로그램의 흐름을 다시 시작하기를 원하지 않기 때문에,'std :: terminate'에서 던져 버린 이벤트가 아니라는 것을 의미하지는 않습니다.) –

관련 문제