![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
||
|
|
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
как известно, исключения в Делфи могут носить уведомительный характер и обрабатываться в "вышестоящих" процедурах или методах.
но на сколько оправдано использование исключения, генерируемого в случае нарушения доступа к памяти для проверки на корректность указателя на экземпляр класса? вот пример кода:
вот примерно такой метод был предложен одним из участников форума для "отслеживания" созданности формы... только вместо TSomeClass.SomeMethod другой класс и метод соотв. использовался. так предлагаю обсудить все плюсы и минуся такого подхода. от себя скажу одно: я считаю, что так писать НЕДОПУСТИМО голосоуем, высказываемся) -------------------- There are always someone smarter than you... |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Вопрос некорректный.
Ибо ответ - да. Возможено. Но не стоит. Я бы даже сказал - моветон. Максимум - ассерты, не включаемые в релиз. Исключения должны использоваться по назначению. Например в случаях обращения к железу или сети. То есть там, где мы не гарантируем однозначность исхода. Также порождение исключений имеет смысл в библиотеках, при несоблюдении правил обращения. Но строить на нах логику - дурной тон. Отладка таких приложений - сплошной геморрой. |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
"самодельные" исключения - может и да. но никак не AV... -------------------- There are always someone smarter than you... |
|||
|
||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Получение AV уже само по себе плохо. А использование любого AV в логике программы - я думаю, как минимум, грубая ошибка. Представляю, каково будет людям, которые потом будут читать подобный код и пытаться отладить
По-моему, исключения и ошибки (коими и являются AV), это совершенно разные вещи и применять их надо для тех целей, для которых они предназначены, а не для тех, которые в данный момент удобны (как некоторым кажется) или которые могут вызывать ошибки далее. -------------------- ![]() |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Под исключениями я понимал try, отловленные AV, raise.
А что касается сознательных AV, то я вообще не вижу места для их применения. Их просто не должно быть в коде. |
|||
|
||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Во-во!!! И я про то же!!! -------------------- ![]() |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
именно про сознательные AV я имел ввиду) -------------------- There are always someone smarter than you... |
|||
|
||||
| ama_kid |
|
||||||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 15 Всего: 95 |
MetalFan, я поставил ответ "Да" только потому, что вопрос действительно, как сказал Snowy, не совсем некорректен и я это знаю на 100% ибо применяю. Если бы вопрос звучал "Корректно ли использовать AV..." - тогда бы я промолчал, ибо действительно не знаю...
Но что мы получили в итоге? Пока мы получили только де-факто материал для новой "религиозной войны", не более того. В моем топике ты мне написал хороший ответ, не спорю, но опять же - давай по порядку?
Snowy При всем к тебе уважении, чем обосновано такое утверждение? Конкретным примером? Или просто принципиальным неиспользованием? Я, например, про оператор goto тоже много аналогичного слышал, и хотя согласен с таким утверждением и после школьных времен сам никогда не использую, но тем не менее никогда не скажу вслух категоричного "нет", ибо знаю границы его применения и могу допустить возможность его использования. Ну и (если честно) не очень люблю "табу" в программировании... P.S. В общем, пока я в растерянности... С одной стороны - все вокруг говорят, что подчинение AV своим нуждам - это моветон, это недопустимо, это грубейшая ошибка, но с другой стороны: 1) пока никто не предоставил убедительного доказательства ошибочности использования такого подхода... 2) голые теории пока меня не убеждают (тем более, что в принципе эти все доводы я и сам прекрасно понимаю)... 3) И самое главное - уже довольно продолжительное время я использую этот подход при 0% некорректной отработке... Все, кому довелось сопровождать мой код - не раз говорили мне о чистоте и логичности моего кода (не в качестве хвастовства, а для ответа на "Отладка таких приложений - сплошной геморрой" и "Представляю, каково будет людям, которые потом будут читать подобный код и пытаться отладить"). Неужели они все притворялись? Пойду выпью йаду... -------------------- самурай без меча подобен самураю с мечом, но только без меча |
||||||
|
|||||||
| Rennigth |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
ama_kid,
Не буду повторять слова других участников этого топика и двух других связанных, но скажу что ответил Нет вопросе и тож считаю такой подход неприемлимым. P.S. А тебе самому не надоело во время отладки ловить эксептионы и нажимать каждый раз OK+F9? Добавлено через 5 минут и 59 секунд ama_kid, Кстати, а чем тебе не нравиться подход например вот такой:
При вызове:
Или я контекст упустил уже -------------------- (* Honesta mors turpi vita potior *) |
||||
|
|||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Никто не запрещает использовать данный приём.
Просто есть некоторые критерии, по которым характеризуется качество кода. Тот же goto сильно ухудшает понимание логики кода. В коде должна быть логичность и красота. Это ж искусство |
|||
|
||||
| pseud |
|
||||||||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
ama_kid, вспомним твой код.
Пофантазируем. 1)------------- Допустим у формы fmOptions есть несколько конструкторов. CreateFull(AOwner: TComponent); - создаем форму со всеми контролами видимыми. CreateGeneral(AOwner: TComponent); - создаем форму только с основными контролами видимыми. Create(AOwner: TComponent; AParam: Integer); reintroduce; - создаем форму еще через какой-то кавардак. Далее. 2)------------- Раз ты вызываешь метод ShowModal, значит ты предполагаешь, что форма ранее была создана, но не удалена. А если она была создана первым конструктором. А ты бы хотел создать ее 2м конструктором. Наверно тогда ты заюзаешь конструкцию:
В итоге в коде твоей проги будет намешан салат из разных методов создания/открытия форм. 3)------------- Мне кажется что гораздо логичнее (если ты подозреваешь что форма уже создана) сделать так:
а может так:
-------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
||||||||
|
|||||||||
| aktuba |
|
||||||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
А какое тебе надо доказательство - написать код, который будет валить одни AV??? Извени, но я привык к обратному и вряд ли смогу подобное организовать.
Если сам понимаешь, как же они тебя не убеждают? Какая-то не понятная, для меня, логика...
Вполне возможно, никто этого и не отрицает... Но я бы, если увидел такое в действительности, так не сказал бы. Подобный подход чем то напоминает следующее - если автомобиль врезался, подкачаем колесо, если не врезался - доедем так... Где логика? -------------------- ![]() |
||||||
|
|||||||
| ama_kid |
|
||||||||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 15 Всего: 95 |
Вот к примеру этим:
Конечно, согласен! Но... понятие красоты - для каждого своё, и я не возьмусь судить красоту в чьем-то понимании только потому, что оно не совпадает с моим, более того, я всегда постараюсь её понять... Блин, ушел во флейм... Ладно, всем спасибо за интересные мнения, ушел домой обдумывать... -------------------- самурай без меча подобен самураю с мечом, но только без меча |
||||||||
|
|||||||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
А ты думаешь это не может вызвать исключения? Указатель-то жыв еще может быть. Ты в суть проблеммы не вник. ama_kid, Ползуется своим способом чтобы всегда быть уверенным чтобы быть уверенным что ничего криминального не случиться. Просто его подход к проблеме немного всех удивил. Добавлено через 45 секунд Добавлено через 3 минуты и 22 секунды А зачем глобальный указатель переназначать!!!? А если ты в CloseForm всегда будешь ее разрушать и обнулять ее указатель то все будет нормально. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| pseud |
|
||||||||||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
aktuba, прав. Автомобиль ведь врезался не обязательно из-за сдутого колеса, хотя вполне возможно это было причиной. ShowModal вызвал exception не обязательно из-за отсутствия формы, хотя вполне возможно это было причиной. Например создаю 2 формы с кнопкой в каждой и пишу код в одной форме
во второй
ama_kid, Да действительно ShowModal вызовет Exception.
Но не из-за отсутствия Form1. А из-за того что она уже лежит под модальной формой Form2. Да код отработает но на экране будет пирог (причем очень не сладкий) 1. TForm1, на которую уже нет указателя (мы его отдали, см.п.3). 2. Form2: TForm2; 3. Form1: TForm1; Добавлено через 8 минут Rennigth, а помоему ни капельки не жив: Pointer(Obj) := nil;
-------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
||||||||||
|
|||||||||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |