2
제가 C++ 프로그램에 있다고 가정하고이 보고서를 예외로 변환하려고합니다. 합리적인 방법으로 C++ throw 문을 사용하고 있습니까? 아니면 stderr로 리다이렉트하고 있습니까?_CrtSetReportHook에서 예외를 throw 할 수 있습니까?
제가 C++ 프로그램에 있다고 가정하고이 보고서를 예외로 변환하려고합니다. 합리적인 방법으로 C++ throw 문을 사용하고 있습니까? 아니면 stderr로 리다이렉트하고 있습니까?_CrtSetReportHook에서 예외를 throw 할 수 있습니까?
아니요, 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);
}
그것을 잡으려고 : 당신이 무엇을해야
은 다음과 같다? main()이 반환 된 후 일반적으로 호출됩니다. 이것은 디버깅 기능으로 잘 제어 된 환경에서 실행됩니다. –
저는 주로 main() 외부에있는 ASSERT [E]와 같은 호출을 생각하고 있습니다. –
그것은 던지지 않습니다. 그들 중에 * 많은 *이있을 수 있으며, 빨리 늙어 버립니다. 기본 처리기의 문제점은 무엇입니까? –