Главная страница
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.048 c
2-1345986998
Wadimka
2012-08-26 17:16
2013.03.22
Кто-нибудь работал с компонентом SecureBridg?


15-1335001121
antonn
2012-04-21 13:38
2013.03.22
релюшка на 220


15-1347565047
Artem
2012-09-13 23:37
2013.03.22
Сегодня выбрал тему дипломный работы.


2-1339967231
ankazh
2012-06-18 01:07
2013.03.22
DBLookupComboBox


15-1343127924
картман
2012-07-24 15:05
2013.03.22
библиотека с++ для кроссплатформенной разработки