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

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

try..finally


d.l. ©   (2010-01-27 17:48:00) 

Будет ли грамотным использование в данном случае блока try..finally или же это излишне
 
procedure GetUpdateFiles(var Files: TStrings);
 var
   FR: Integer;
   SR: TSearchRec;
 begin
   Files.Clear;
   FR := FindFirst(UpdatePath + '*.*', faAnyFile, SR);
   try
     while FR <> 0 do
     begin
       if SR.Attr <> faDirectory then
         Files.Add(SR.Name);
       FR := FindNext(SR);
     end;
   finally
     FindClose(SR);
   end;
 end;


Игорь Шевченко   (2010-01-28 11:36:00) [1]

oxffff ©   (28.01.10 10:03) [12]


>
> А если рассмотреть эту функцию элемент библиотеки и оставить
> потребителю решение вопроса о продолжении или краха с треском.
>  
> Конечно Ваш подход может использовать незащищенную версию
> библиотеки например с условной компиляцией. Однако вы же
> не во всех частях Ваших программ падаете с треском на исключениях.
>  
> Или уже во всех? :)


Че ?


> А между тем исключение вполне ожидаемо.
>
> Из теории типов языков программирования
> Ref A не может быть заменена на Ref B, если A<>B, где A,
> B типы.
> Из чего следует что A=B.


Че ?


oxffff   (2010-01-28 10:44:00) [2]


> Игорь Шевченко ©   (27.01.10 19:47) [7]
> clickmaker ©   (27.01.10 19:32) [6]
>
> Все верно. Finally оно зачем нужно - освободить во что бы
> то ни стало ресурсы для дальнейшего продолжения работы (возможно,
>  с теми же ресурсами). Где-то сверху except обработается
> (в любом случае), и если планируется продолжение работы,
>  то желательно, разумеется, освободить ресурс, в данном
> случае FindHandle.
>
> Вот я и думаю, какого типа exception может случиться в этом
> коде, чтобы его можно было по сути проигнорировать. И не
> вижу такого exception-а.


А если рассмотреть эту функцию элемент библиотеки и оставить потребителю решение вопроса о продолжении или краха с треском.
Конечно Ваш подход может использовать незащищенную версию библиотеки например с условной компиляцией. Однако вы же не во всех частях Ваших программ падаете с треском на исключениях.
Или уже во всех? :)


oxffff   (2010-01-28 10:03:00) [3]


> Игорь Шевченко ©   (27.01.10 19:16) [5]
> Излишне.
>
> RTFS: sysutils.pas
>
>  FindFirst is typically used with FindNext and FindClose
> as follows:
>
>    Result := FindFirst(Path, Attr, SearchRec);
>    while Result = 0 do
>    begin
>      ProcessSearchRec(SearchRec);
>      Result := FindNext(SearchRec);
>    end;
>    FindClose(SearchRec);
>
> Какое исключение может возбудить TList.Add, при котором
> можно безболезненно продолжать работу ?


А между тем исключение вполне ожидаемо.

Из теории типов языков программирования
Ref A не может быть заменена на Ref B, если A<>B, где A,B типы.
Из чего следует что A=B.

Поэтому в эту процедуру можно передать только переменнуютипа TStrings. Что не запрещает caller передать туда экземпляр TStrings.

А TStrings

Derive a class from TStrings to store and manipulate a list of strings. TStrings contains abstract or, in C++ terminology, pure virtual methodsand should not be directly instantiated.

И получить AV.

Далее
2. Наследник Tstring может генерировать исключение на Add.
3. Освободить экземпляр из другого потока.


Anatoly Podgoretsky   (2010-01-27 20:20:00) [4]

В D3 все приведеные коды могут вызвать исключение, если FindFirst ничего не найдет. Попытка освобождения несозданого ресурса, правда далее Борланд против криворуких сделал защиту.


Игорь Шевченко   (2010-01-27 19:59:00) [5]

Дмитрий Белькевич   (27.01.10 19:52) [8]


>
> Наступление на try..finally? :)
>
> Я бы оставил.


Беда в том, что я тоже в большинстве случаев оставляю :)

Однако иногда код доходит до абсурда и нечитабельности, поэтому я (лично) стал критически относиться к лишним операторам. В том числе и к тем, что "во что бы то ни стало освободить занятый Handle, пусть даже он нафиг никому не нужен, пусть даже в середине кода сплошные API-фукнции, которые исключений не возбуждают, а если случится Access Violation, то лучше сразу сдохнуть с треском, чем продолжать мучения".


Riply   (2010-01-27 19:57:00) [6]

> [7] Игорь Шевченко ©   (27.01.10 19:47)
> Вот я и думаю, какого типа exception может случиться в этом коде, чтобы его можно было по сути проигнорировать.
> И не вижу такого exception-а.

RichEdit взбунтовался, что не может добавить строку ?


Дмитрий Белькевич   (2010-01-27 19:52:00) [7]

>Она не меняется внутри функции, поэтому слово var следует убрать.

Возможно думали, что Clear и/или Add - это и есть изменение. Но это не так.

>Какое исключение может возбудить TList.Add, при котором можно безболезненно продолжать работу ?

Наступление на try..finally? :)

Я бы оставил.


Игорь Шевченко   (2010-01-27 19:47:00) [8]

clickmaker ©   (27.01.10 19:32) [6]

Все верно. Finally оно зачем нужно - освободить во что бы то ни стало ресурсы для дальнейшего продолжения работы (возможно, с теми же ресурсами). Где-то сверху except обработается (в любом случае), и если планируется продолжение работы, то желательно, разумеется, освободить ресурс, в данном случае FindHandle.

Вот я и думаю, какого типа exception может случиться в этом коде, чтобы его можно было по сути проигнорировать. И не вижу такого exception-а.


clickmaker   (2010-01-27 19:32:00) [9]

> при котором можно безболезненно продолжать работу ?

там же finally, а не except...


Игорь Шевченко   (2010-01-27 19:16:00) [10]

Излишне.

RTFS: sysutils.pas

 FindFirst is typically used with FindNext and FindClose as follows:

   Result := FindFirst(Path, Attr, SearchRec);
   while Result = 0 do
   begin
     ProcessSearchRec(SearchRec);
     Result := FindNext(SearchRec);
   end;
   FindClose(SearchRec);


Какое исключение может возбудить TList.Add, при котором можно безболезненно продолжать работу ?

кроме того, почему переменная Files объявлена, как var ?
Она не меняется внутри функции, поэтому слово var следует убрать.


Германн   (2010-01-27 18:54:00) [11]

Еще грамотным будет заменить SR.Attr <> faDirectory на (SR.Attr and faDirectory) <> faDirectory


d.l.   (2010-01-27 18:21:00) [12]


> грамотным будет заменить FR <> 0 на FR = 0если конечно речь
> идет о получении списка файлов в папке


точно блин


Медвежонок Пятачок   (2010-01-27 18:14:00) [13]

грамотным будет заменить FR <> 0 на FR = 0
если конечно речь идет о получении списка файлов в папке


clickmaker   (2010-01-27 18:00:00) [14]

будет


Наверх

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