2011-08-05 4 views
2

제가 C++ 프로그램에 있다고 가정하고이 보고서를 예외로 변환하려고합니다. 합리적인 방법으로 C++ throw 문을 사용하고 있습니까? 아니면 stderr로 리다이렉트하고 있습니까?_CrtSetReportHook에서 예외를 throw 할 수 있습니까?

+0

그것을 잡으려고 : 당신이 무엇을해야

은 다음과 같다? main()이 반환 된 후 일반적으로 호출됩니다. 이것은 디버깅 기능으로 잘 제어 된 환경에서 실행됩니다. –

+0

저는 주로 main() 외부에있는 ASSERT [E]와 같은 호출을 생각하고 있습니다. –

+0

그것은 던지지 않습니다. 그들 중에 * 많은 *이있을 수 있으며, 빨리 늙어 버립니다. 기본 처리기의 문제점은 무엇입니까? –

답변

2

아니요, C++ 예외는 사용할 수 없습니다.

시간이 걸릴 수도 있지만 일반적으로 훅이 호출 될 때 CRT는 불확정 상태이며 더 이상 예외를 throw하거나 처리 할 수 ​​없습니다. CRT에 문제가있을 때 예외를 throw하는 것은 예외로 인해 스택 해제 중에 호출 된 객체의 소멸자에서 예외를 throw하는 것과 비슷한 시나리오입니다. 또한 CRT의 깊이는 C++ 예외를 throw하는 적절한 장소가 아니므로 런타임이 나쁜 상태가 될 수 있습니다. 예상되는

int no_dialog_box_but_act_as_if_it_had_appeared_and_abort_was_clicked (int /* nRptType */, 
                     char *szMsg, 
                     int * /* retVal */) 
{ 
    fprintf (stderr, "CRT: %s\n", szMsg); 

    /* raise abort signal */ 
    raise (SIGABRT); 

    /* We usually won't get here, but it's possible that 
    SIGABRT was ignored. So exit the program anyway. */ 
    _exit (3); 
} 
관련 문제