Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
1-13223
Rise
2003-05-27 12:39
2003.06.05
Сохранение числа?


3-13057
Reals
2003-05-16 20:08
2003.06.05
ПОДСКАЖИТЕ ПОЖАЛУЙСТА по поводу Microsoft.Jet.OLEDB.4.0


3-13092
Patrick
2003-05-19 09:23
2003.06.05
Сброс параметра автоувеличения значения поля.


3-13000
SVΚ
2003-05-19 12:19
2003.06.05
InterBase и UNICODE


1-13226
vv
2003-05-16 14:05
2003.06.05
Спрятать прогу в Tray





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский