2012-01-27 2 views
4

MFC 응용 프로그램에서 최상위 try/catch 위치는 어디입니까?MFC 애플리케이션에서 어디에서 최상위 try/catch를 넣을까요?

난 MFC 응용 프로그램이 있고 모든 예외를 잡아 내 자신의 메시지 상자를 표시하고 싶습니다. 나는 블록을 넣을 수 있습니다

try 
{ 
    // What enclose here? Or, where to put this try/catch block? 
} 
catch(const std::exception& e) 
{ 
    ::MessageBox(0,e.what(),"I do not know hot to handle this exception, I will terminate",MB_OK); 
} 
catch(...) 
{ 
    ::MessageBox(0,"Unknown Excpetion","I do not know hot to handle this exception, I will terminate",MB_OK); 
} 
::TerminateProcess(::GetCurrentProcess(), -1); 

하지만, :

이 내 최상층 try/catch 블록에 대한 생각? Visual Studio 2010을 기반으로하는 MFC 대화 상자 기반 응용 프로그램을 만들고 Release x64에서 컴파일했는데 Windows 7입니다. OnTimer 메서드를 사용하여 std::exception (문자열을 생성자에 전달)을 던지고 이 일반 메시지

으로 csrss.exe 의해 작성된 메시지 박스 "예외 알 수없는 소프트웨어 예외 (0x40000015)가 위치 0x5dff61c9에서 애플리케이션에서 발생했습니다."

"프로그램을 마치려면 [확인]을 클릭"

메시지 상자가 나는 예외에 부착 된 문자열을보고하지 않습니다 "프로그램을 디버그하려면 [취소]를 클릭"그래서 그것을하지 않습니다 매우 유용합니다. Windows Error Reporting Service를 사용하지 않도록 설정하고 WerFault.exe의 이름을 변경했기 때문에 멋진 TaskDialog 대신 메시지 상자가 나타납니다.

아마도 내 자신의 메시지 상자를 잊어 버려야하고 새로운 Windows 오류보고를 받아 들여야합니까?

답변

2

MFC 응용 프로그램에서 처리되지 않은 예외를 처리하는 올바른 방법은 CWinApp::ProcessWndProcException

당신은 특정 예외 유형을 처리 할 수 ​​있습니다를 무시하는 것입니다. 경우에 따라 기본 동작으로 돌아가려면 기본 구현을 호출하십시오. 기본 전화를하지 않으면 앱이 종료되지 않습니다.

사용자 지정 오류 메시지를 표시 한 다음 기본 메시지를 표시하지 않고 종료하려면 메시지 상자를 표시 한 다음 기본 프레임/대화 상자에서 DestroyWindow을 호출하십시오.

+0

안녕하세요, 이것은 CException이 처리되지 않은 경우에만 호출됩니까? 사용자 정의 예외 클래스에 대해 비슷한 동작을 제공하는 방법이 있습니까? 감사합니다. – NHDaly

+0

CException을 상속 한 처리되지 않은 예외는'ProcessWndProcException'에서 처리됩니다. 코드에서 이것을 쉽게 테스트 할 수 있습니다. –

+0

자, 고마워. (예, 미안 해요, 지금은 Windows 컴퓨터가 아닙니다 ..) 또한 사용자 정의 예외 클래스에 대해 동일한 동작을 제공하는 방법을 알고 있습니까? 감사합니다. – NHDaly

관련 문제