![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Try ... finally при выходе из программы [D7]
yurikon © (2012-05-02 18:45:00)Добрый день!
В обработчике события FormClose главной формы в секции try ... finally выполняю запрос к базе данных. Если сервер возвращает ошибку, то выполнение процедуры прекращается и программа дальше продолжает работать.
Почему в данном случае защитная секция не срабатывает?
С уважением.
yurikon (2012-05-03 16:25:00) [1]Сенк за обсуждение! Топик можно закрывать.
Anatoly Podgoretsky (2012-05-03 15:43:00) [2]Можно оба выкинуть.
Юрий Зотов (2012-05-03 15:02:00) [3]
> Приветствую еще раз!
> если сделать два вложенных try ... finally - то форма не будет закрываться.
Хоть сто. Здесь нужен try-except, а не try-finally. Кстати, try-finally можно убрать совсем и оставить только try-except.
Плохиш (2012-05-03 14:46:00) [4]
> Я раньше думал, что эти конструкции "одинаковые", оказывается
> не совсем!
У конструкций кроме начального try и конечного end больше ничего одинакового нет. В справке всё подробно описано и даже с примерами.
Плохиш (2012-05-03 14:43:00) [5]
> Хотя если сделать два вложенных try ... finally - то форма
> не будет закрываться.
Да хоть 100500 мильёнов своих try ... finallyнапихай. Всё-равно следующиму обработчику исключительных ситуаций глубоко начхать, что ты там соизволил присвоить переменной Action, он(обработчик) о ней и понятия не имеет.
PS. Программиста нанять здесь уже советовали?
Anatoly Podgoretsky (2012-05-03 13:50:00) [6]Приведи код с двумя try ... finally, наверно ошибка там
yurikon (2012-05-03 13:40:00) [7]Приветствую еще раз!
Да я прекрасно понимаю, что так нельзя делать. Просто заело - почему не отрабатывает защитная секция.
2 Юрий Зотов:
Ваш пример работает! Хотя если сделать два вложенных try ... finally - то форма не будет закрываться.
Я раньше думал, что эти конструкции "одинаковые", оказывается не совсем!
Юрий Зотов (2012-05-03 11:49:00) [8]
> yurikon (03.05.12 10:10) [6]
> нужно в секции try выполнить действия и в не зависимости от того,
> будет там ошибка или нет, завершить программу. Как должен выглядеть
> этот пример в таком случае?
Например, так:
procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
sl: TSTringList;
begin
try
try
// создаем ошибку доступа к памяти
sl.Free
except
// гасим любое исключение
end
finally
Action := caFree
end
end;
Но это очень плохой стиль. Прислушайтесь к [8].
Palladin (2012-05-03 11:20:00) [9]Надо исправлять ошибки доступа, а не скрывать их при закрытии.
sniknik (2012-05-03 10:15:00) [10]Германн © (02.05.12 19:04) [2]
yurikon (2012-05-03 10:10:00) [11]Что-то я в замешательстве.
Простой пример.
procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
sl: TSTringList;
begin
// создаем ошибку доступа к памяти
try
sl.Free;
finally
Action := caFree;
end;
end;
И из программы уже не выйти. Мне нужно в секции try выполнить действия и в не зависимости от того, будет там ошибка или нет, завершить программу. Как должен выглядеть этот пример в таком случае?
yurikon (2012-05-03 09:46:00) [12]Спасибо за помощь. Не заметил вар параметр Action.
Сергей М. (2012-05-02 20:41:00) [13]он срабатывает, даже не сомневайся в этом.
но ты смотришь там где светлее, а не там где лежит.
Медвежонок Пятачок (2012-05-02 19:32:00) [14]кто тебе сказал, что код файнали не выполняется?
у тебя вар параметр формклозе остается в фалсе.
Германн (2012-05-02 19:04:00) [15]
> в секции try ... finally
Может надо было использовать try...except?
Anatoly Podgoretsky (2012-05-02 18:58:00) [16]> yurikon (02.05.2012 18:45:00) [0]
Возможно ошибка в программе.