Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

О try..finally и создании объектов :) [D5, Win2k]


Альф ©   (2003-01-27 11:45:00) 

Как будет обрабатываться ini.Free();при неудачном создании объекта ???
try
ini := TIniFile.Create("Какой-то ini");
finally
ini.Free();
end;{try}

И как правильно реализовывать такие конструкции ?
Заранее благодарен :)


Альф   (2003-01-27 13:53:00) [1]

2Юрий Зотов © (27.01.03 12:24)
Спасибо - еще большее чем в первый раз :)))

2Chubais © (27.01.03 12:32)
Свет есть - УПСа нет :(


Chubais   (2003-01-27 12:32:00) [2]

Альф © (27.01.03 12:19)
неужто света нет и упс уже помирает? ))))))))


Юрий Зотов   (2003-01-27 12:24:00) [3]

> Альф © (27.01.03 12:00)
Вот так делать как раз не нужно. Почему - я написал выше. И лищние проверки, и лишние присвоения тоже ни к чему.

> Альф © (27.01.03 12:05)
А вот так делать можно. Но обычно try-except не пишут, он просто не нужен. Внутренний try-except в конструкторе уничтожает объект и перевозбуждает исключение, поэтому он сам выдаст нужную диагностику. Дополнительный try-except (как у Вас) нужен только если мы хотим это исключение перехватить. Но имейте в виду, что Ваш код перехватыват не только исключения в конструкторе, а вообще все подряд.


Альф   (2003-01-27 12:19:00) [4]

2Chubais © (27.01.03 12:16)

А отгадай с одного раза :)))


Chubais   (2003-01-27 12:16:00) [5]


> Альф © (27.01.03 12:12)

c xtuj "n& Ж;-))


Chubais   (2003-01-27 12:16:00) [6]


с чего эт? Ж;-))


Альф   (2003-01-27 12:12:00) [7]

2Chubais © (27.01.03 12:10)
:))) - ну и ник у тя - в дрожь бросает


Chubais   (2003-01-27 12:10:00) [8]

Альф © (27.01.03 12:05)
ага


Chubais   (2003-01-27 12:09:00) [9]

Альф © (27.01.03 12:00)
А почему НЕ ???

ну подумай...


Альф   (2003-01-27 12:05:00) [10]

2Юрий Зотов © (27.01.03 11:58)
Спасибо.

Тогда выходит так нужно делать ???
try
ini := TIniFile.Create(...);
try
...
finally
Ini.Free();
end;{try2}
except
// Объект не создан
end;{try1}


Альф   (2003-01-27 12:00:00) [11]

2Romkin © (27.01.03 11:54)
А почему НЕ ???
try
ini := TIniFile.Create("Какой-то ini");

тогда при exceptionна TIniFile.Createмы сразу попадаем на finally- а при таком создании:
ini := TIniFile.Create("Какой-то ini");
try
//Работаем с ini - Create точно прошел

внутри tryini может быть не определен ???
или делать так для страховки:
try
ini := nil;
ini := TIniFile.Create("Какой-то ini");
if Assigned(ini)
then //чего-то


Юрий Зотов   (2003-01-27 11:58:00) [12]

При любом exception в конструкторе созданный в нем объект автоматически в нем же и уничтожается. Поэтому правильно - не вносить создание в блок try, иначе повторное уничтожение объекта в finally даст повторное исключение. Вот две типовые схемы правильной работы с объектом:

Ini := TIniFile.Create(...);
try
...
finally
Ini.Free
end;

with TIniFile.Create(...) do
try
...
finally
Free
end;


Romkin   (2003-01-27 11:54:00) [13]

Не надо assigned, это во Free проверяется

ini := TIniFile.Create("Какой-то ini");
try
//Работаем с ini - Create точно прошел
finally
ini.Free;
end;{try}
</code


Mike Kouzmine   (2003-01-27 11:51:00) [14]

if Assigned(ini) then ini.free;


Наверх

Титульная страница Поиск, карта сайта Написать письмо