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

Вниз

Где в таком случае делать 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.01 c
15-1321121151
xayam
2011-11-12 22:05
2012.03.04
Нетбук на солнечной батарее


2-1322306478
3asys
2011-11-26 15:21
2012.03.04
запись в Subitem TListView


15-1320746965
Витя
2011-11-08 13:09
2012.03.04
Я старею , или нет?


15-1320611403
Юрий
2011-11-06 23:30
2012.03.04
С днем рождения ! 7 ноября 2011 понедельник


15-1321213096
black2008
2011-11-13 23:38
2012.03.04
ищу автора или исходники (лото 2005) yurec66.narod.ru