![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
О 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;