Как лучше всего создать исключение из модального диалога? - PullRequest
1 голос
/ 13 марта 2012

У меня есть функция, которая показывает диалоговое окно модели и ждет, пока пользователь что-то сделает, однако это сложно и, возможно, что-то не так, и в этом случае будет выдано исключение.

Вот предполагаемый код, который вызывает эту функцию с обработкой исключений:

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

Пользовательский интерфейс диалога написан на ATL, и давайте предположим, что есть обработчик кнопки OnClick следующим образом:

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

Однако при выполнении вышеуказанного кода, как только было сгенерировано исключение, в режиме отладки я вызвал утверждение ATL, которое утверждает, что HWND диалога должно быть нулевым (но на самом деле оно еще не очищено).

Что я хочу знать, так это как решить эту проблему и разрешить вызывающей стороне перехватить исключительную ситуацию и убедиться, что все ресурсы были освобождены должным образом?

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Звонок EndDialog должен решить вашу проблему:

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

И да, передавать исключения через границы модуля не рекомендуется.

1 голос
/ 13 марта 2012

Несколько советов:

Я бы постарался не выбрасывать исключения через границы сообщений и особенно не разные модальные циклы сообщений.Существует несколько промежуточных слоев, и даже если он работает (что, похоже, в данном случае не работает), он вызывает проблемы.

Я бы посоветовал использовать EndDialog при ошибке и сохранитькакой-то код ошибки в самом классе диалога, который вызывающий может проверить на «неожиданный» код результата из диалога (например, IDCANCEL).Таким образом, диалог по-прежнему «уходит» при ошибке, все разрешено правильно очищать, и вам не нужно беспокоиться о том, чтобы убедиться, что все работает с нестандартной обработкой ошибок диалога.Мой 2с.

...