Главная страница
    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.009 c
1-97295
Rooman
2002-05-16 09:18
2002.05.30
Поменять шрифт у всех компонентов на форме на Tahoma


3-97162
voronkov
2002-05-03 15:45
2002.05.30
Что лучше использовать для работы с ODBC.


14-97398
copyr25
2002-04-19 21:58
2002.05.30
Завтра вся московская милиция будет


1-97296
sdmitrii
2002-05-19 06:17
2002.05.30
Реализация drag&Drop несколько строк из StringGrid а


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