Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.03.04;
Скачать: [xml.tar.bz2];

Вниз

Где в таком случае делать try?   Найти похожие ветки 

 
БезымянныйСтудент   (2011-10-08 18:02) [0]

Изучаю правильную работу с объектами классов VCL.
Нашёл совет что всегда нужно обязательно делать так:

cls:=MyClass.Create();
try
 cls.dosomething(); // используем ресурс
finally
 cls.Free; // освобождение ресурса
end;

Оно всё вроде понятно, но что делать если я создаю объект при запуске приложения, а удалять надо при закрытии?
Например TBitmap... Где тогда делать Try? Как поступать в таком случае?

p.s. Интернета у меня нету, вернусь через неделю... =(


 
antonn (work)   (2011-10-08 19:09) [1]

не try, а finally, там еще except"ы всякие есть.
при создании ставить блок обработки ошибок, удалять в событии на закрытие (хотя, в общем-то, оно само очистится)


 
DVM ©   (2011-10-08 19:53) [2]


> БезымянныйСтудент   (08.10.11 18:02) 


> но что делать если я создаю объект при запуске приложения,
>  а удалять надо при закрытии?

Если объект является полем какого либо класса, то можно создавать в конструкторе, а удалять в деструкторе. Если объект не является полем класса, то все точно так же как ты написал.


 
Anatoly Podgoretsky ©   (2011-10-08 19:54) [3]

Try тогда делать не надо.


 
_Юрий   (2011-10-08 20:12) [4]

потому что негде


 
Anatoly Podgoretsky ©   (2011-10-08 20:14) [5]

Почему негде, может и есть где, но кода нет.


 
Inovet ©   (2011-10-08 20:46) [6]

Код через неделю будет, может.


 
Омлет ©   (2011-10-08 21:03) [7]

Удалено модератором


 
Германн ©   (2011-10-09 00:21) [8]


> но что делать если я создаю объект при запуске приложения,
>  а удалять надо при закрытии?

Ничего не надо делать. Винда всё сделает сама.


 
БезымянныйСтудент   (2011-11-02 11:19) [9]

Простите что долго не был, я тут болел... =(

> Если объект является полем какого либо класса, то можно создавать в конструкторе, а удалять в деструкторе.

Так вот я и спрашиваю - а куды тогда try/finally?))
Наверное тогда try/except при работе с экземпляром? А создание и освобождение экземпляра не надо в try засовывать?

> Почему негде, может и есть где, но кода нет.

Я хочу научиться правильному подходу... Для любого кода...

> хотя, в общем-то, оно само очистится

Ну как ж не надо-то? Освобождение ж всегда надо... А если при закрытии TForm программа ещё не завершает работу?


 
Dimka Maslov ©   (2011-11-02 11:26) [10]

Сперва надо разобраться, что такое try...finally...end. Потом понять в чём отличие глобального объекта, объекта-поля класса и локального объекта внутри процедуры/функции. Тогда станет ясно, что
1. Глобальные объекты создаются в секции initialization модулей, а освобождаются в finalization. Никакого трая не надо.
2. Объект-поле создаётся в конструкторе другого объекта, а освобождается в деструкторе. Никакого трая не надо.
3. Локальный объект создаётся и освобождается внутри метода. При этом буде возникнет исключение, объект не удалится и продолжить своё существование в куче. Чтобы избежать этой ситуации и используется блок трай...финалли...енд.


 
БезымянныйСтудент   (2011-11-02 11:37) [11]

> Dimka Maslov ©   (02.11.11 11:26) [10]

Спасибо... =)
А можете посоветовать книгу именно про такое? У меня дома и-нета нет, гуглить негде... Буду благодарен какому-то конкретному названию...

А получается при использовании объекта-поля или глобального объекта надо try/except тогда?


 
Anatoly Podgoretsky ©   (2011-11-02 12:04) [12]


> Так вот я и спрашиваю - а куды тогда try/finally?))

Кода нет


 
Германн ©   (2011-11-02 12:18) [13]


> А получается при использовании объекта-поля или глобального
> объекта надо try/except тогда?
>

try/except это вообще другая опера.


 
Amoeba_   (2011-11-02 12:55) [14]


> А можете посоветовать книгу

http://www.podgoretsky.com/ddp/OtherDDP.aspx


 
QAZ   (2011-11-02 13:05) [15]


> что делать

не использовать никаких тру\ексептов никогда и нигде,а все вылазиющие ошибки находить и исправлять


 
Anatoly Podgoretsky ©   (2011-11-02 13:14) [16]

> QAZ  (02.11.2011 13:05:15)  [15]

Принято, но бывают исключения


 
QAZ   (2011-11-02 13:33) [17]


> но бывают исключения

какие,типа "опять винда глючит"?


 
Anatoly Podgoretsky ©   (2011-11-02 13:43) [18]

Нет, просто не обслуживаемый сервер, там не кому на кнопку нажать.


 
Dimka Maslov ©   (2011-11-02 13:50) [19]


> А можете посоветовать книгу именно про такое

Любая книга по дельфи,имеющая раздел "Обработка исключений"


 
QAZ   (2011-11-02 13:59) [20]

какую кнопку :) есть ошибка - есть реакция ,нажатие кнопок непричом,это уже из раздела юзабительности\необходимости
программы на то и делятся на серверные и десктопные што одни с кнопками другие ду


 
Юрий Зотов ©   (2011-11-02 14:20) [21]

> БезымянныйСтудент   (08.10.11 18:02)  

Общее (и универсальное) правило такое - объект надо создавать тогда, когда он становится нужен и удалять сразу, как только он становится уже не нужен. Это правило работает всегда.

> Нашёл совет что всегда нужно обязательно делать так:
> cls:=MyClass.Create();
> try
>  cls.dosomething(); // используем ресурс
> finally
>  cls.Free; // освобождение ресурса
> end;


Не всегда и не обязательно. Пример этот правильный, но он показывает технику работу с временным объектом. Как видите, этот пример точно соответствует общему универсальному правилу - когда объект стал нужен, то его создали, а когда работу с ним закончили и он стал уже не нужен, то его сразу же удалили. Блок try-finally здесь гарантирует уничтожение объекта всегда - даже если в методе dosomething возникнет исключение.

Но Ваш вопрос к этому примеру не относится, потому что Вы спрашиваете не о временном, а о постоянном объекте:  
> что делать если я создаю объект при запуске приложения,
> а удалять надо при закрытии?


Вспоминаем общее универсальное правило: объект надо создавать тогда, когда он становится нужен и удалять сразу, как только он становится уже не нужен. Раз объект постоянный, то создавать его надо при старте программы (что Вы и делаете) а удалять - в любом куске кода, который выполняется при завершении программы (например, в обработчике события OnDestroy главной формы).

Но если постоянный объект не захватывает никаких системных ресурсов, кроме памяти, то такой объект можно и вовсе не удалять - при завершении программы система сама освободит всю захваченную программой память.


 
Dennis I. Komarov ©   (2011-11-02 18:27) [22]


> QAZ   (02.11.11 13:59) [20]

TService?


 
БезымянныйСтудент   (2011-11-16 15:13) [23]

> объект надо создавать тогда, когда он становится нужен и
> удалять сразу, как только он становится уже не нужен.


А если он требуется переодически? Но на протяжении всей работы программы... Я просто думаю что если класс требуется по нескольку раз в минуту, то зачем его постоянно создавать и удалять?

> не использовать никаких тру\ексептов никогда и нигде,а все
> вылазиющие ошибки находить и исправлять


Но практически все классы выбрасывают исключения! Их же тоже надо как-то обработать...
Как пример - TIdHTTP выбросит исключение если нет интернета или ресурса... Как вы это "исправите" не используя try/except?

> try/except это вообще другая опера.

Согласен, это уже другой вопрос...


 
QAZ   (2011-11-16 15:34) [24]


> Но практически все классы выбрасывают исключения! Их же
> тоже надо как-то обработать...

у application есть событие OnException в которое если определен приходят все исключения


 
Юрий Зотов ©   (2011-11-17 00:24) [25]

> БезымянныйСтудент   (16.11.11 15:13) [23]

> А если он требуется переодически? Но на протяжении всей
> работы программы...

Тогда все равно работает Общее Универсальное Правило, но и здравого смысла еще никто, нигде и никогда не отменял.

> Я просто думаю что если класс требуется по нескольку раз
> в минуту, то зачем его постоянно создавать и удалять?

А вот это и есть тот самый здравый смысл.


 
Германн ©   (2011-11-17 00:34) [26]


> БезымянныйСтудент   (16.11.11 15:13) [23]


> Но практически все классы выбрасывают исключения! Их же
> тоже надо как-то обработать...
> Как пример - TIdHTTP выбросит исключение если нет интернета
> или ресурса... Как вы это "исправите" не используя try/except?
>

Ты бы всё-таки понял наконец, что "блоков try есть две разновидности":
1. try
 ...
finally
 ...
end;

Разработан для гарантированной очистки памяти в случае возникновения какого-либо исключения. Дабы "не мусорить".
2. try
 ...
except
 ...
end;

Разработан для пользовательской обработки возникающих исключений. Дабы сообщить пользователю максимальную и максимально понятную информацию об исключении.


 
Германн ©   (2011-11-17 00:57) [27]

Вдобавок.
Суперпозиция обоих разновидностей тоже порой нужна.


 
sniknik ©   (2011-11-17 01:01) [28]

> А если он требуется переодически? Но на протяжении всей работы программы...
сравни время на удаление+создание со временем очистки "сохраняемого" обьекта под новые данные. и решай после, что выгоднее.
в базах к примеру delete из таблицы (очистка), работает гораздо медленнее trancate (удаление+пересоздание). в памяти тоже бывает...


 
Ega23 ©   (2011-11-17 01:10) [29]


> Разработан для гарантированной очистки памяти в случае возникновения
> какого-либо исключения. Дабы "не мусорить".


Не обязательно.
Items.BeginUpdate\EndUpdate; DataSet.DisableControls\EnableControls; EnterCriticalSection\LeaveCriticalSection
И т.д.


 
Германн ©   (2011-11-17 01:40) [30]


> Ega23 ©   (17.11.11 01:10) [29]
>
>
> > Разработан для гарантированной очистки памяти в случае
> возникновения
> > какого-либо исключения. Дабы "не мусорить".
>
>
> Не обязательно.

В "конечном итоге" именно для этого.


 
Anatoly Podgoretsky ©   (2011-11-17 10:00) [31]


> Как пример - TIdHTTP выбросит исключение если нет интернета
> или ресурса... Как вы это "исправите" не используя try/except?
>

Сомневаюсь я что то, что с помощью try/except можно исправить, придется тебе лапу сосать пока он без тебя появится.


 
Anatoly Podgoretsky ©   (2011-11-17 11:45) [32]

Хотя почему бы и нет
Try
 InternetOpen;
except
 RepairInternet;
end;


 
RTFM   (2011-11-17 13:20) [33]


> А можете посоветовать книгу именно про такое?


Как вариант: http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1392


 
bems ©   (2011-11-24 18:18) [34]


>
> не использовать никаких тру\ексептов никогда и нигде,а все
> вылазиющие ошибки находить и исправлять

Пример: я создаю временный файл. Мне не важно какое имя у него будет, но важно чтобы он создался. Если я перед попыткой создания файла найду свободное имя, то это не гарантирует что оно будет свободно на момент моей попытки создания файла, потому что любой тред в системе может создать файл с таким именем в любой момент. Единственный способ убедиться что я могу создать файл с таким именем это попытаться создать и не получить при этом ошибки.
Если получаю исключение, я могу проверить действительно ли проблема в том что файл уже существует, и если так, то увеличить счетчик и сгенерить по нему следующее имя. Иначе снова сделать raise


> Сомневаюсь я что то, что с помощью try/except можно исправить,
>  придется тебе лапу сосать пока он без тебя появится.

Можно перейти к следующему ресурсу из списка (следующей итерации), предварительно залоггировав ошибку. Например для массовых рассылок сбой на одном ресурсе не является критической проблемой для рассылки в целом, важно разослать на как можно большее число ресурсов. Или восмпользоватьсмя следующим прокси из списка, если на текущем прикрыли лавочку


 
Ega23 ©   (2011-11-24 19:01) [35]


> QAZ   (02.11.11 13:33) [17]
>
>
> > но бывают исключения
>
> какие,типа "опять винда глючит"?


TFileStream.Create



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.03.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.004 c
15-1321342175
oleg1963lora
2011-11-15 11:29
2012.03.04
Анимация *.gif объектов


2-1321982178
Виталий
2011-11-22 21:16
2012.03.04
Отправление писем из Delphi 7 через Outlook


6-1235561131
MALAN
2009-02-25 14:25
2012.03.04
Как перехватить API функции (Connect, Bind) и изменить их парамет


15-1321293166
oxffff
2011-11-14 21:52
2012.03.04
Отправка посылки из Москвы


15-1321278885
KilkennyCat
2011-11-14 17:54
2012.03.04
Хочешь заработать?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский