Форум: "Начинающим";
Текущий архив: 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