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