![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| кварк |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 2.8.2002 Репутация: нет Всего: нет |
А почему нет конструкции Try...except...finally?
И как бы ее реализовать? Во многих случаях это нужно. Ну например, создаем файл:
Там, где действия, могут возникнуть исключения (ну, например, места на диске не хватит). Надо бы их перехватить. Мне пришло на ум следующее:
Можно ли упростить эту конструкцию? Без потери функциональности, конечно. А то она выглядит ужасно громоздкой. Отдельный вопрос по переменной tfsCreated: нигде не встречал, что операция Create обязана возвращать nil при ошибке создания объекта. Просто пару раз сталкивался с ситуацией, что указатель не nil, а тем не менее, объект не создается -> результат любого обращения предсказуем. С тех пор полюзуюсь такой "фигней". Может, как-нибудь можно проверить по объекту создан ли он? И еще большая странность: процедура Free не устанавливает указатель в nil. На мой взгляд, весьма странное поведение - кому нужен несуществующий указатель, Assigned() от которого возвращает true? IMHO случаев, когда эта ситуация вредна гораздо больше, нежели тех, где она может принести пользу (вообще сомневаюсь в их наличии, разве что экзотика какая). Про FreeAndNil я знаю, но это же лишний вызов функции... |
||||
|
|||||
| Петрович |
|
||||||||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Естественно. Но тут как говорится на вкус и цвет...: Классический вариант:
В этом варианте не различают обработку ошибок создания, и записи файла. Лично я, обычно предпочитаю например что-то подобное:
На первый взляд сложно, но зато информативно. Хотя в каждом конкретном случае, возможны варианты.
Дык не должна, и естественно не возвращает. В случае ошибок, tfs.Created возбуждает исключение и соответственно ничего возвратить в принципе не может.
А Free, это не процедура. Это метод объекта, на конкретный экземпляр которого, указывает некая переменная о которой он ничего не знает, и поэтому не в состоянии ее изменить.
Абсолютно верно, никому.
Так точно. Пользу она вообще принести не может - только вред.
Ну, ты хоченш что-бы все сделалось само? Правда в моих примерах он без надобности. В них, обращение к уже уничтоженному экземпляру по указателю tfs в принципе не возможно. -------------------- Все знать невозможно, но хочется |
||||||||||||||||
|
|||||||||||||||||
| кварк |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 2.8.2002 Репутация: нет Всего: нет |
Спасибо за такой развернутый ответ.
Действительно, классический вариант гораздо красивше.
На самом деле классно было бы проверять наличие объекта. А что, нет быстрых способов узнать: указывает ли данный указатель на корректную область памяти в пределах приложения? |
||||
|
|||||
| Петрович |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Ну, тогда компилятор должен особым образом генерить код вызова метода Free. Получится что все методы равны, но некоторые ровнее. А мы знаем к чему это приводит, достаточно взлянуть на нашу страну, или на процедуры Read, ReadLn, Write, WriteLn. Кроме того, это все равно не решит всех проблем. Вот например:
Нет даже медленных Более простого способа нет. К примеру, во фрагменте приведенном выше, указатель o2 будет указывать на память принадлежащую приложению, но в данный момент не занятую никаким объектом, если кончено приложение не многопоточное. -------------------- Все знать невозможно, но хочется |
||||||
|
|||||||
| кварк |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 2.8.2002 Репутация: нет Всего: нет |
Вот чего я пока не понял - так это того, что в Exception есть поле "текстовое сообщение", а поля "код ошибки" нет. Т.е. в общем случае приходится анализировать текстовую строку. Причем эта строка может быть локализована, поэтому по-хорошему так делать не надо. Приходится писать в столбик "on e:EAccessViolation do", ... "on e:Exception do". При этом надо помнить все типы исключений. Это сообщение отредактировал(а) кварк - 21.1.2005, 11:38 |
|||
|
||||
| Петрович |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Не прокатит Дело в том, что область памяти которую ранее занимал уничтоженный объект, может быть повторно выделена, уже под другой объект, либо под динамическую переменную (String, DynArray и пр.). Тогда, AV может и не быть (смотря как обращаешся). Причем, бывает даже так: Был объект, например tStringList. В нем были строки 'Вася', 'Петя', 'Маша'. Указатель на этот объект был в перменной x. Потом этот объект грохнули (x.Free). Через некоторое время вновь создали объект tStringList и разместили указатель на него в y (y := tStringList.Create). Поместили в него строки 'Гриша', 'Миша', 'Сергей'. Потом просто лезем в x.Strings[0] и получаем 'Гриша'!. А дело в том, что новый объект tStringList "лег" в памыть занимаемую ранее старым tStringList. Поэтому, x вновь стал "действительным". Можешь поверить, сам с таким сталкивался, правда не у себя в программе
Это и правдо печально.
Именно так и приходится. Правда помнить не приходится. Всетаки ООП, наследование, и т.п. не зря придоманны -------------------- Все знать невозможно, но хочется |
||||||
|
|||||||
![]()
|
| Правила форума "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. |