2012-03-13 3 views
1

나는 모델 대화 상자를 보여주고 사용자가 무언가를하기를 기다리는 기능을 가지고 있지만, 복잡하고 뭔가 잘못되었을 수 있으며 예외가 발생합니다. 여기 모달 대화 상자에서 예외를 throw하는 가장 좋은 방법은 무엇입니까?

는 예외 처리와이 함수를 호출하는 가정 코드입니다 :

try { 
    CMyDialog mydialog(); 
    mydialog.DoModal(); 
} 
catch(std::logic_error &e){ 
    DoExceptionHandling(); 
} 

대화 상자 UI는 ATL로 작성, 우리는 다음과 같이 버튼의 OnClick 핸들러가 있다고 가정 할 수있다 :

LRESULT CMyDialog::OnBnClickedBlah(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/){ 
    ... 
    throw std::logic_error("BlahBlah"); 
} 

그러나 위의 코드를 실행하면 디버그 모드에서 예외가 발생하면 대화 상자의 HWND가 null이어야한다고 주장하는 ATL 어설 션을 트리거했습니다 (실제로는 아직 지워지지는 않습니다).

내가 알고 싶은 것은이 문제를 해결하고 호출자가 예외를 캡처 할 수 있도록하는 방법이며 모든 리소스가 제대로 해제되었는지 확인하는 것입니다.

답변

1

조언 : 나는 메시지 경계를 넘어 예외가 발생하지 않도록 노력 것이며, 특히 차이가 모달 메시지 루프

. 몇 가지 개재 된 레이어가 있으며 작동하더라도 (이 경우에는 보이지 않는 것처럼 보입니다.) 문제가 생길 것입니다.

오류에서 EndDialog를 사용하고 호출자가 대화 상자의 "예기치 않은"결과 코드 (예 : IDCANCEL)에서 검사 할 수있는 일종의 오류 코드를 대화 상자 클래스 자체에 저장하는 것이 좋습니다. 그런 식으로 대화 상자가 여전히 오류가 발생하면 모든 것이 올바르게 정리되고 비표준 대화 오류 처리로 모든 것이 제대로 작동하는지 걱정할 필요가 없습니다. 내 2c.

+0

귀하의 조언은 좋은 것입니다. 그러나 나는 여기서 나의 동기를 설명하고 싶다. 'DoModal '에 대한 호출은 GUI가없는 일반 함수 호출과 같이 문법적으로 보입니다. 왜냐하면 실행 흐름이 끝날 때까지 실행 흐름을 차단하기 때문입니다. 구현은 실제로 매우 다르지만 왜 동일하게 만들 수 없는지 이해합니다. 한 가지 해결책은 대화 상자 객체 생성과'DoModal' 메소드를 단일 함수로 캡슐화하고 조언을 적용하는 것입니다. –

1

문제를 해결해야 EndDialog를 호출 :

CMyDialog mydialog(); 
try { 
    mydialog.DoModal(); 
} 
catch(std::logic_error &e){ 
    mydialog.EndDialog(IDABORT); 
    DoExceptionHandling(); 
} 

그리고 네, 모듈 경계를 넘어 통과 예외가 권장되지 않습니다.

관련 문제