Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.006 c
15-1262970823
Кто б сомневался
2010-01-08 20:13
2010.03.28
Уровень жизни рейтинг International Living.


15-1263074944
Илья_
2010-01-10 01:09
2010.03.28
Игра FIFA 2010 по сети


15-1262975426
Pitbull
2010-01-08 21:30
2010.03.28
HTML Help Workshop


3-1237289266
Yurikon
2009-03-17 14:27
2010.03.28
Количество записей в TADOTable


2-1264703807
Jimmy
2010-01-28 21:36
2010.03.28
Задержка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский