Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.076 c
15-1342691121
AV
2012-07-19 13:45
2013.03.22
Помните, в перестройку Лысенков некий Телемаркет рекламировал?


2-1330408314
AV
2012-02-28 09:51
2013.03.22
Владение критической секцией


15-1350390543
AV
2012-10-16 16:29
2013.03.22
Узнать свой пароль в текущей сессии oracle


2-1333469036
toropoff
2012-04-03 20:03
2013.03.22
обозначение чисел к компиляторе.


2-1342265873
rioko
2012-07-14 15:37
2013.03.22
StringGrid и удаление выделеных строк.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский