Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.075 c
15-1332713589
-111-
2012-03-26 02:13
2013.03.22
office starter 2010


2-1342616491
Максим
2012-07-18 17:01
2013.03.22
как отсортировать данные, не занося ВСЕХ их в массивы?


1-1260020917
defen
2009-12-05 16:48
2013.03.22
асинхронное шифрование rsa


6-1264750451
Pavel
2010-01-29 10:34
2013.03.22
Многопоточность в Indy


15-1333312206
Юрий
2012-04-02 00:30
2013.03.22
С днем рождения ! 2 апреля 2012 понедельник