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

Вниз

Ошибка в try-finally-end?   Найти похожие ветки 

 
spi   (2002-05-17 08:19) [0]

Давно меня мучает вопрос: "Почему никто не обращает внимание на неадекватное поведение конструкции try-finally-end в Delphi?"
Дело в том, что блок завершения, обозначенный оператором finally, должен срабатывать при выходе из блока try при помощи оператора Exit, а вместо этого уходим на конец процедуры (функции).

Пример:

a := 1;
hFile := CreateFile(...);
try
if a =1 then
Exit;
a := 2;
finally
CloseHandle(hFile)
end;
end;

В данном примере освобождение дескриптора hFile не произойдет, т.к. оператор Exit передаст управление на конец функции. Оператор return в соответствующей конструкции языка C ведет себя по другому....


 
Song   (2002-05-17 08:23) [1]

Неа, блок завершения, обозначенный оператором finally, должен срабатывать при выходе из блока try при помощи оператора Abort, а никак не Exit. Последний служит для выхода из текущего модуля.


 
Mystic   (2002-05-17 09:36) [2]

Нет, дескриптор будет освобожден в любом случае. Перед тем, как перейти на конец функции при выполнении Exit, автоматически выполнятяться все finally-блоки. Тут ты не прав..


 
Victor_Kozel   (2002-05-17 11:28) [3]

1. Пять строк для проверки :-)

try
exit;
finally
showMessage("ok");
end;

2. Ни Abort ни Exit не являются операторами.
Abort просто генерит EAbort эксэпшен. Что касается Exit - читайте help.
The standard procedure Exit can occur within the body of any procedure or function. Exit halts execution of the routine where it occurs and immediately passes program control back to the point from which the routine was called.


 
Song   (2002-05-17 11:35) [4]

В данном контесте оператор, инструкция - не имеет принципиальной разницы.


 
Игорь Шевченко   (2002-05-17 11:47) [5]

Victor_Kozel (17.05.02 11:28)

Чуть больше строк для проверки:

unit Controls.pas

// Free the first available device context
procedure FreeDeviceContext;
var
I: Integer;
begin
with CanvasList.LockList do
try
for I := 0 to Count-1 do
with TControlCanvas(Items[I]) do
if TryLock then
try
FreeHandle;
Exit;
finally
Unlock;
end;
finally
CanvasList.UnlockList;
end;
end;


Вряд ли в Borland считают, что Exit не вызовет срабатывание блоков finally :-)

С уважением,



 
Victor_Kozel   (2002-05-17 14:34) [6]

Народ, хочу поставить точку, а то у меня впечатление, что
каждый остался при своем мнении.
обработчики try..finally вызываются даже после процедуры Exit.
Я думаю spi был введен в заблуждение поведением отладчика
последних версий делфи - для входа в обработчик finally необходимо нажать F7 а не F8, т.е. зделать trace into.
В четвертой версии проход отладчика осуществлялся в любом случае.


 
Song   (2002-05-17 14:40) [7]

Поведение отладчика вовсе ни о чёи не говорит...


 
NailS   (2002-05-17 14:57) [8]

Посмотрим, что пишет Борланд в хелпе про finally

try statementList1 finally statementList2 end;

If a call to the Exit, Break, or Continue procedure causes control to leave statementList1, statementList2 is automatically executed. Thus the finally clause is always executed, regardless of how the try clause terminates.


 
spi   (2002-05-18 11:37) [9]

Ребята, спасибо, дествительно поведение отладчика D6 вызвало у меня недоумение. Вопрос с повестки дня снимается.



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

Форум: "Основная";
Текущий архив: 2002.05.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.008 c
1-97338
Anry
2002-05-20 09:18
2002.05.30
WinXP и поиск в проводнике


14-97426
Explorer
2002-04-18 12:06
2002.05.30
RXLib под D6


1-97215
normal
2002-05-18 07:54
2002.05.30
Динамическое создание TThread


1-97326
[BAD]Angel
2002-05-19 15:21
2002.05.30
Нужна помошь с переводом текста


14-97384
Morfey
2002-04-20 19:12
2002.05.30
декоммпилятор





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский