![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
К примеру надо написать такоe:
Очевидно, что большинство этих функций могут вернуть ошибку. Вопрос: как вы пишите код чтобы эти ошибки корректно обработать? |
|||
|
||||
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
try
{ Твой проблемный код } catch (CFileException *e) или другой клас смотри мсдн { Обработка ошибки } Добавлено @ 11:57 Пользуйтесь поиском и факю -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
вы используете для каждого объекта (блока памяти, ключа реестра, файла итд) класс - обертку или просто удаляете их после catch (...)?
подчеркну, что мне интересны способы, которые на практике используют участники форума, а не канонические (описанные в msdn). Кстати лично я exception недолюбливаю. |
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
AndyY
Что-тоя не въехал ![]() |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
bel_nikita прав.
Все WinAPI-шные функции сохраняют последнюю ошибку в особой глобальной переменной, которую можно получить с пом. функции GetLastError(). А уже расшифровать смысл значения кода ошибки можно с пом. ряда действий, как именно - см. в нашем FAQ. -------------------- ![]() |
|||
|
||||
Royan |
|
|||
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
GetLastError() хороша, но зачастую в ней меняется значение ошибки, хотя таковая не на что и не повлияла. Это черевато тем, что ошибка вроде бы появилась, пользовотелю мы об этом сообщели, а что может быть хуже вобще прекратили выполнение какой-либо операции, а при детальом анализе окажется, что дело то и выеденного яйца не стоит. Просто пример. Поробуйте помотреть как изменется значение возвращаемой ошибки до и после вызова CreateWindow(...), при этом просто создайте окно(практика показывает, что создание предопределнных классов большей часть проходит успешно).
AndyY, в ответ на твой вопрос, я вот например, написал пару-тройку функций для работы как с GetLastError, так и со всем остальным и заключил все в namespace, а после к ним можно обращаться откуда угодно, могу весь код положить сюда. Это сообщение отредактировал(а) Royan - 10.5.2004, 19:50 -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
хм, обсуждение на мой взгляд несколько ушло в сторону.
меня интересовал вопрос, кто как справляется с проблемой - что-то внутри сложной функции не получилось сделать - как организовать код, чтобы освободить все занятые ресурсы и при этом код остался легко модифицируемым и читаемым. диагностика причины облома - тоже безусловно полезная штука, на мой взгляд больше информации чем пара GetLastError/обломившаяся функция с параметрами/стек вызова в общем случае не получить (особенно-удаленно). |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
AndyY, как вариант - можно все функции, возвращающие NULL/не NULL в случае успеха или наоборот, заключать в макросы типа ASSERT, которые проверяют условие на истинность и вызывают исключение в случае неудачи. Пример (с отключаемыми в Release-версии проверками):
В качестве практического примера можно заключить в MY_ASSERT вызов функций RegOpenKey, UnmapViewOfFile и пр. -- все они возвращают значение, по которому можно определить, выполнена ли операция успешно; проверив это значение макросом MY_ASSERT, можно выполнить некие действия при возникновении ошибки - закрыть файл, освободить память, выдать сообщение с информацией об ошибке из объекта CMyException *ex (это сообщение содержит номер строки, имя файла и выражение, вызвавшее ошибку -- вполне исчерпывающая информация). -------------------- ![]() |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
mr.DUDA спасибо, ваш метод понятен.
Значит, ваш код выглядит примерно так:
Жду еще мнений. Если интересно, свой взгляд на проблему я изложил тут |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |