Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Механизм исключений в MFC, практическое применение эксцепшионов 
V
    Опции темы
zkv
Дата 9.8.2006, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



 Здравствуйте. Вопрос назрел давно. Поисковики молчат.  Помогите.
  Есть ли какие-то неписанные правила организации механизма исключений в приложении? (больше всего интересует вопрос касаемо MFC- приложений c MDI и Document/View support, если это принципиально) Т.е. как следует правильно все это дело реализовать, чтобы потом, когда кто-нибудь будет разбирать мой код не плевался в монитор?
 Также, как вы считаете все ли возможные исключения следует отлавливать? Например, метод CView::GetDocument() (допустим мы не знаем, что у него внутри, некоторый черный ящик), стоит ли предусматривать возможность перехвата исключения которое он может сгенерировать? Или об этом уже за меня "кто-то" подумал? 
  По части MFC,  нормально ли использовать класс CException во всех случаях жизни. К примеру при ошибке в операторе new генерируется исключение bad_alloc, следует перехватывать его или работать с CMemoryException, или вообще по старинке проверять указатель и потом лепить что-то свое?
  Не будет "караться" использование каких либо своих типов исключений?
__________________________________________
  На данный момент вижу один вариант реализации этого самого механизма - берем и во все-все методы, прям в их тело на всю ширину пихаем try-блоки вместе с catch-ами за ними, и прям на месте все подряд ловим и перерабатываем. В результате всех этих действий код раздувается неимоверно.  У меня есть подозрение, что это не самый лучший путь, но как по другому сделать своего ума не хватает.
  Подскажите, есть ли какие нибудь статьи или книжки, где эти вопросы освещены? Ну и в идеале, конечно, хотелось бы услышать мнение профессионалов Винграда! (прогиб, надеюсь, зафиксирован, как говорили в нашей роте smile )
PM MAIL   Вверх
Earnest
Дата 9.8.2006, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



В MFC-framework встроен перехват всех необработанных исключений CException во внешнем цикле обработки сообщений. Так что в этом смысле там все "схвачено": необработанное исключение будет корректно обработано, и программа продолжит работу. Насколько нормально - зависит от того, насколько exception-safe твой код. Но это только для наследников CException. Другие исключение, в т.ч. и исключения стандартной библиотеки, нужно перехватывать самому.
Цитата(zkv @  9.8.2006,  01:36 Найти цитируемый пост)
 На данный момент вижу один вариант реализации этого самого механизма - берем и во все-все методы, прям в их тело на всю ширину пихаем try-блоки вместе с catch-ами за ними, и прям на месте все подряд ловим и перерабатываем.

Ужас, летящий на крыльях ночи... smile 

Ну, во-первых, в нормальном коде исключения могут возникать только по внешним причинам: пользователь ввел какую-нибудь дрянь, жесткий диск внезапно выпал, и т.д. Таких мест не так много, их все можно и нужно обработать. Где и как - зависит от обстоятельств. Главное, чтобы после перехвата исключения программа могла нормально продолжаться. Все остальные исключения, в том числе структурные (обращения по невалидному адресу и т.д.) должны быть устранены путем тщательной отладки. В критичные модули (или во внешний цикл сообщений) можно добавить обработчик catch (std::excpetion) и catch (...). Есть еще bad_alloc, но, если программа не работает с огромными блоками памяти, тоже экзотика. А если работает - см. выше.





--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0398 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.