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

Вниз

try..finally   Найти похожие ветки 

 
d.l.   (2010-01-27 17:48) [0]

Будет ли грамотным использование в данном случае блока 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;


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

будет


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

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


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


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


точно блин


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

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


 
Игорь Шевченко ©   (2010-01-27 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, при котором можно безболезненно продолжать работу ?

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


 
clickmaker ©   (2010-01-27 19:32) [6]

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

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


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

clickmaker ©   (27.01.10 19:32) [6]

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

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


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

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

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

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

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

Я бы оставил.


 
Riply ©   (2010-01-27 19:57) [9]

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

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


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

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


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


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

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


 
Anatoly Podgoretsky ©   (2010-01-27 20:20) [11]

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


 
oxffff ©   (2010-01-28 10:03) [12]


> Игорь Шевченко ©   (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 methods and should not be directly instantiated.

И получить AV.

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


 
oxffff ©   (2010-01-28 10:44) [13]


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


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


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

oxffff ©   (28.01.10 10:03) [12]


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


Че ?


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


Че ?



Страницы: 1 вся ветка

Текущий архив: 2010.03.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
2-1264184513
Alexey
2010-01-22 21:21
2010.03.28
ID3 теги и кодировка


15-1262890350
AlexDan
2010-01-07 21:52
2010.03.28
подключение через проксисервер..


2-1264707676
AntiDotNet
2010-01-28 22:41
2010.03.28
Смена Hint а в трее


15-1262855052
Александр Иванов
2010-01-07 12:04
2010.03.28
Настройка SSL в IIS 6.0


2-1264495718
Цукор5
2010-01-26 11:48
2010.03.28
Утечка памяти