Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Где в таком случае делать try? [D7, 2000, XP]


Страницы:   1 2

БезымянныйСтудент ©   (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]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо