Форум: "Основная";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];
ВнизИсключение в Finalization Найти похожие ветки
← →
Top Gun (2003-05-24 11:41) [0]Вот есть:
finalization
operator1;
operator2;
end;
Если в operator1 произойдет исключение - будет ли выполнен operator2 ?
← →
Юрий Федоров (2003-05-24 12:03) [1]Нет
← →
Top Gun (2003-05-24 12:08) [2]Блин, а что делать то, если у меня идет зачистка памяти ?!
типа
finalization
MyObj1.free;
MyObj2.free;
FreeMem(s1);
FreeMem(s2);
end;
P.S. И в finally значит если исключение возникнет - он прервется ?
← →
Palladin (2003-05-24 12:13) [3]в finalization по определению не должны попадать участки подозрительные на exception
← →
Top Gun (2003-05-24 12:22) [4]По моему, любой оператор может вызывать exeption...
Чтоб не было исключений - надо ничего не писать.
Я же описал ситуацию выше - освобождение памяти, удаление объектов - нормальная ситуация для finalization ?! ПО моему, нормальная. А они, как вы понимаете, могут вызвать исключение...
← →
Юрий Федоров (2003-05-24 12:33) [5]>>По моему, любой оператор может вызывать exeption...
Не любой. Не нужно впадать в крайности и перезакладываться на то, что теоретически возможно. Например, программа не обязана корректно работать, если в момент ее выполнения компьютер уронили на пол :-)
← →
Юрий Федоров (2003-05-24 12:35) [6]Тем более что по закрытию программы ресурсы все равно будут освобождены операционкой
← →
Malder (2003-05-24 12:55) [7]Смотря какой операционкой и смотря какие ресурсы...
← →
Palladin (2003-05-24 13:01) [8]почему не может освободится память? потому что вероятно она была не правильно занята, вот это ты и долже отследить...
← →
Top Gun (2003-05-24 13:08) [9]А блок finally Тоже так действует ? Если в нем произойдет исключение - тоже прервется ?
← →
Mystic (2003-05-24 13:10) [10]
MyObj1.free;
MyObj2.free;
if Assigned(s1) then FreeMem(s1);
if Assigned(s2) then FreeMem(s2);
При нормальном ходе программы этот код не должен возбуждать исключения. Другое дело, если в программе образовались "висячие" ссылки. Их надо не допускать, т. е. ошибка где-то не здесь.
← →
Юрий Федоров (2003-05-24 13:17) [11]>>Top Gun (24.05.03 13:08)
Да
← →
Top Gun (2003-05-24 13:53) [12]Mystic © (24.05.03 13:10)
ну, ссылка может и не быть равна nil ! А вот если она указывает не туда, и я пытаюсь освободить не то...
← →
VaS (2003-05-24 15:12) [13]Заключи каждое гепотетически опасное освобождение в отдельный try..except. Можно всю эту радость поместить ради эстетики в отдельную процедуру.
← →
Anatoly Podgoretsky (2003-05-24 15:41) [14]Это не может вызвать исключение если программа правильно написана, для этого ты не должен беспорядочно выделять память.
← →
Top Gun (2003-05-25 18:23) [15]Хорошо, а если такая конструкция:
rewrite(F1)
rewrite(F2)
rewrite(F3)
...
finally
closefile(F1);
closefile(F2);
closefile(F3);
end;
Я же не знаю на каком Rewrite может произойти исключение ! Соответственно, и closefile вызовет исключение ! Можео примеры и посложнее придумать...
← →
Anatoly Podgoretsky (2003-05-25 18:52) [16]Да какая разница какой сложности примеры, недао не допускать, а если есть опасность то существует блок try except end
← →
Ihor Osov'yak (2003-05-25 19:18) [17]Top Gun (25.05.03 18:23)
Ну так заведи флажки, или измени логику программы.. Флажки можешь использовать битовые..
Зы. Для любителей искать приключения скажу по секрету - первые четыре байта струтуры file есть хендл открытого файла, и если файл не был открыт - то он равен нулю.. Но это недокументировано и на это ставки делать не нужно..
Зы2. Снова скажешь, что я тебя оскорбляю?
← →
Anatoly Podgoretsky (2003-05-25 19:35) [18]Ну там еще есть и поле Mode, которое равно в этом случае fmClosed
← →
Ihor Osov'yak (2003-05-25 19:51) [19]> Но это недокументировано
Сорри, я не прав.
Пишем TFileRec, подводим курсор, жмем F1 и читаем:
Description
TFileRec is the internal format for typed and untyped files. TFileRec enables you to typecast a file variable to access its internal fields.
Note: You would normally never declare a variable of this type.
← →
Top Gun (2003-05-26 00:00) [20]Да какая разница какой сложности примеры, недао не допускать, а если есть опасность то существует блок try except end
Ну не каждый же оператор обкладывать try...except
В общем, я к чему клоню, хотелось бы такой код, где все операторы бы исполнялись по любому. Ну я ведь говорю - примеры и сложнее бывают. Нужно файлы временные за собой подчистить, в реестре там поменять что-то и т.д. И чтобы если где произошел сбой - на остальное не повлияло.
Можно конечно с помощью try...except реализоват, но это так читаться будет...
Зы2. Снова скажешь, что я тебя оскорбляю?
Нет, я ничего такого не говорил
← →
Нуу (2003-05-26 01:54) [21]2 Top Gun (26.05.03 00:00)
>Ну не каждый же оператор обкладывать try...except
>В общем, я к чему клоню, хотелось бы такой код, где все >операторы бы исполнялись по любому. Ну я ведь говорю - примеры >и сложнее бывают. Нужно файлы временные за собой подчистить, в >реестре там поменять что-то и т.д. И чтобы если где произошел >сбой - на остальное не повлияло.
>Можно конечно с помощью try...except реализоват, но это так >читаться будет...
Конечно хотелось бы, но оставим фантастику ЕЁ мастерам. Все, что у нас есть - это блоки "try except" и "try finally". Исходя из этого и приходится действовать. А ответов на все случаи жизни - просто не существует!
← →
Anatoly Podgoretsky (2003-05-26 08:02) [22]Top Gun (26.05.03 00:00)
Самый верный путь - не использовать Finalization - ты явно не поинмаешь и не умеешь его использовать и фантазии по возможностям операционной системы и Дельфи очень у тебя большие. Мало ли чего еще захочется, может компилятор десятого поколения.
Finalization в основном нужен для построения пользовательских компонент и то в ограниченном случае, а не для выполнения штатных операций по управлению твоей программой.
← →
evvcom (2003-05-26 09:40) [23]> Top Gun
Для всего того, о чем пишешь, есть классы. В Create или по требованию выделяешь память, а в Destroy ее освобождаешь. То же и с файлами, реестром и т.д. И не заводи без крайней нужды глобальных переменных. Почти всегда их можно воткнуть в класс.
← →
Top Gun (2003-05-26 17:50) [24]Finalization в основном нужен для построения пользовательских компонент
???!!! По моему, бред. А что скажут мастера ? Хотя против AP вряд ли попрут :-)
← →
VMcL (2003-05-26 18:08) [25]2 (Top Gun)
Не понимаю, что тут обсуждать. Берём Delphi Help, раздел "Try...finally statements" и "The finalization section" и читаем.
>>The finally clause should therefore handle all locally raised exceptions, so as not to disturb propagation of other exceptions.
← →
Palladin (2003-05-26 18:46) [26]
> Top Gun (26.05.03 17:50)
ну ты не совсем до конца прав, я не попру конечно, ибо АП прав, но только не в тему топика. :)
← →
Oooooooooooops (2003-05-26 19:26) [27]Oooooooooooops
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c