![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Где в таком случае делать try? [D7, 2000, XP]
БезымянныйСтудент © (2011-10-08 18:02:00)Изучаю правильную работу с объектами классов VCL.
Нашёл совет что всегда нужно обязательно делать так:
cls:=MyClass.Create();
try
cls.dosomething(); // используем ресурс
finally
cls.Free; // освобождение ресурса
end;
Оно всё вроде понятно, но что делать если я создаю объект при запуске приложения, а удалять надо при закрытии?
Например TBitmap... Где тогда делать Try? Как поступать в таком случае?
p.s. Интернета у меня нету, вернусь через неделю... =(
Ega23 (2011-11-24 19:01:00) [1]
> QAZ (02.11.11 13:33) [17]
>
>
> > но бывают исключения
>
> какие,типа "опять винда глючит"?
TFileStream.Create
bems (2011-11-24 18:18:00) [2]
>
> не использовать никаких тру\ексептов никогда и нигде,а все
> вылазиющие ошибки находить и исправлять
Пример: я создаю временный файл. Мне не важно какое имя у него будет, но важно чтобы он создался. Если я перед попыткой создания файла найду свободное имя, то это не гарантирует что оно будет свободно на момент моей попытки создания файла, потому что любой тред в системе может создать файл с таким именем в любой момент. Единственный способ убедиться что я могу создать файл с таким именем это попытаться создать и не получить при этом ошибки.
Если получаю исключение, я могу проверить действительно ли проблема в том что файл уже существует, и если так, то увеличить счетчик и сгенерить по нему следующее имя. Иначе снова сделать raise
> Сомневаюсь я что то, что с помощью try/except можно исправить,
> придется тебе лапу сосать пока он без тебя появится.
Можно перейти к следующему ресурсу из списка (следующей итерации), предварительно залоггировав ошибку. Например для массовых рассылок сбой на одном ресурсе не является критической проблемой для рассылки в целом, важно разослать на как можно большее число ресурсов. Или восмпользоватьсмя следующим прокси из списка, если на текущем прикрыли лавочку
RTFM (2011-11-17 13:20:00) [3]
> А можете посоветовать книгу именно про такое?
Как вариант: http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1392
Anatoly Podgoretsky (2011-11-17 11:45:00) [4]Хотя почему бы и нет
Try
InternetOpen;
except
RepairInternet;
end;
Anatoly Podgoretsky (2011-11-17 10:00:00) [5]
> Как пример - TIdHTTP выбросит исключение если нет интернета
> или ресурса... Как вы это "исправите" не используя try/except?
>
Сомневаюсь я что то, что с помощью try/except можно исправить, придется тебе лапу сосать пока он без тебя появится.
Германн (2011-11-17 01:40:00) [6]
> Ega23 © (17.11.11 01:10) [29]
>
>
> > Разработан для гарантированной очистки памяти в случае
> возникновения
> > какого-либо исключения. Дабы "не мусорить".
>
>
> Не обязательно.
В "конечном итоге" именно для этого.
Ega23 (2011-11-17 01:10:00) [7]
> Разработан для гарантированной очистки памяти в случае возникновения
> какого-либо исключения. Дабы "не мусорить".
Не обязательно.
Items.BeginUpdate\EndUpdate; DataSet.DisableControls\EnableControls; EnterCriticalSection\LeaveCriticalSection
И т.д.
sniknik (2011-11-17 01:01:00) [8]> А если он требуется переодически? Но на протяжении всей работы программы...
сравни время на удаление+создание со временем очистки "сохраняемого" обьекта под новые данные. и решай после, что выгоднее.
в базах к примеру delete из таблицы (очистка), работает гораздо медленнее trancate (удаление+пересоздание). в памяти тоже бывает...
Германн (2011-11-17 00:57:00) [9]Вдобавок.
Суперпозиция обоих разновидностей тоже порой нужна.
Германн (2011-11-17 00:34:00) [10]
> БезымянныйСтудент (16.11.11 15:13) [23]
> Но практически все классы выбрасывают исключения! Их же
> тоже надо как-то обработать...
> Как пример - TIdHTTP выбросит исключение если нет интернета
> или ресурса... Как вы это "исправите" не используя try/except?
>
Ты бы всё-таки понял наконец, что "блоков tryесть две разновидности":
1.try
...
finally
...
end;
Разработан для гарантированной очистки памяти в случае возникновения какого-либо исключения. Дабы "не мусорить".
2.try
...
except
...
end;
Разработан для пользовательской обработки возникающих исключений. Дабы сообщить пользователю максимальную и максимально понятную информацию об исключении.
Юрий Зотов (2011-11-17 00:24:00) [11]> БезымянныйСтудент (16.11.11 15:13) [23]
> А если он требуется переодически? Но на протяжении всей
> работы программы...
Тогда все равно работает Общее Универсальное Правило, но и здравого смысла еще никто, нигде и никогда не отменял.
> Я просто думаю что если класс требуется по нескольку раз
> в минуту, то зачем его постоянно создавать и удалять?
А вот это и есть тот самый здравый смысл.
QAZ (2011-11-16 15:34:00) [12]
> Но практически все классы выбрасывают исключения! Их же
> тоже надо как-то обработать...
у application есть событие OnException в которое если определен приходят все исключения
БезымянныйСтудент (2011-11-16 15:13:00) [13]> объект надо создавать тогда, когда он становится нужен и
> удалять сразу, как только он становится уже не нужен.
А если он требуется переодически? Но на протяжении всей работы программы... Я просто думаю что если класс требуется по нескольку раз в минуту, то зачем его постоянно создавать и удалять?
> не использовать никаких тру\ексептов никогда и нигде,а все
> вылазиющие ошибки находить и исправлять
Но практически все классы выбрасывают исключения! Их же тоже надо как-то обработать...
Как пример - TIdHTTP выбросит исключение если нет интернета или ресурса... Как вы это "исправите" не используя try/except?
> try/except это вообще другая опера.
Согласен, это уже другой вопрос...
Dennis I. Komarov (2011-11-02 18:27:00) [14]
> QAZ (02.11.11 13:59) [20]
TService?
Юрий Зотов (2011-11-02 14:20:00) [15]> БезымянныйСтудент (08.10.11 18:02)
Общее (и универсальное) правило такое - объект надо создавать тогда, когда он становится нужен и удалять сразу, как только он становится уже не нужен. Это правило работает всегда.
> Нашёл совет что всегда нужно обязательно делать так:
> cls:=MyClass.Create();
> try
> cls.dosomething(); // используем ресурс
> finally
> cls.Free; // освобождение ресурса
> end;
Не всегда и не обязательно. Пример этот правильный, но он показывает технику работу с временным объектом. Как видите, этот пример точно соответствует общему универсальному правилу - когда объект стал нужен, то его создали, а когда работу с ним закончили и он стал уже не нужен, то его сразу же удалили. Блок try-finally здесь гарантирует уничтожение объекта всегда - даже если в методе dosomething возникнет исключение.
Но Ваш вопрос к этому примеру не относится, потому что Вы спрашиваете не о временном , а о постоянном объекте:
> что делать если я создаю объект при запуске приложения,
> а удалять надо при закрытии?
Вспоминаем общее универсальное правило: объект надо создавать тогда, когда он становится нужен и удалять сразу, как только он становится уже не нужен. Раз объект постоянный, то создавать его надо при старте программы (что Вы и делаете) а удалять - в любом куске кода, который выполняется при завершении программы (например, в обработчике события OnDestroy главной формы).
Но если постоянный объект не захватывает никаких системных ресурсов, кроме памяти, то такой объект можно и вовсе не удалять - при завершении программы система сама освободит всю захваченную программой память.
QAZ (2011-11-02 13:59:00) [16]какую кнопку :) есть ошибка - есть реакция ,нажатие кнопок непричом,это уже из раздела юзабительности\необходимости
программы на то и делятся на серверные и десктопные што одни с кнопками другие ду
Dimka Maslov (2011-11-02 13:50:00) [17]
> А можете посоветовать книгу именно про такое
Любаякнига по дельфи,имеющая раздел "Обработка исключений"
Anatoly Podgoretsky (2011-11-02 13:43:00) [18]Нет, просто не обслуживаемый сервер, там не кому на кнопку нажать.
QAZ (2011-11-02 13:33:00) [19]
> но бывают исключения
какие,типа "опять винда глючит"?
Anatoly Podgoretsky (2011-11-02 13:14:00) [20]> QAZ (02.11.2011 13:05:15) [15]
Принято, но бывают исключения