Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.05;
Скачать: CL | DM;

Вниз

Исключение в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
7-13483
Shuric
2003-04-03 18:32
2003.06.05
Не напомнит ли кто (про реестр)


1-13307
Suhomlin
2003-05-25 00:29
2003.06.05
Взаимодействие с Outlook


3-13027
vil
2003-05-16 13:59
2003.06.05
OPENROWSET


4-13507
Lexa2003
2003-04-06 23:47
2003.06.05
Закрытие Windows


1-13267
Remis
2003-05-22 23:39
2003.06.05
PopupMenu