Форум: "Начинающим";
Текущий архив: 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.pasFindFirst 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.004 c