Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.14;
Скачать: [xml.tar.bz2];

Вниз

Крыша едет от re-raise   Найти похожие ветки 

 
kva   (2002-11-05 09:04) [0]

Привет всем! Не понимаю выполнение следующего кода, кто может растолковать, откликнитесь.
Есть два участка:

try
F1:=TForm1.Create;
...выполнение чего-то там (3)
except
on E: Exception do
ShowMessage("тра-та-та"+E.Message);
end;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
try
...выполнение чего-то там (1)
...заведомо вызывающее искл. ситуацию для этого примера
except
ShowMessage("оп-ля");
raise;
end;
...выполнение чего-то там (2)
end;


Полагал, что сообщения должны быть в следующей последовательности:
1) ShowMessage("оп-ля");
2) ShowMessage("тра-та-таоп-ля");
и передачи управления на ...выполнение чего-то там (3) не должно быть

На самом деле происходит:
1) ShowMessage("оп-ля");
2) ShowMessage("оп-ля");
и затем идет выполнение чего-то там (3)
Такое впечатление, что Create не находится в try..except;
или Create и OnFormCreate не связаны;
или re-raise отрабатывает не так как я представлял;
или у меня крыша поехала.
Возможно сочетание указанных вариантов :)


 
Andrey007   (2002-11-05 09:42) [1]

А мне не понятно чего Вам не понятно. Всё должно быть именно так, как Вы и описали.
А 2 раза "оп-ля" появляется потому, что первый раз TForm1.FormCreate вызывается когда форма создаётся автоматически, а второй раз - когда выполняется строчка F1:=TForm1.Create;


 
kva   (2002-11-05 09:59) [2]

Неправда ваша Andrey007 (05.11.02 09:42)
1)Форма НЕ создается автоматически, а только по Create. Пройдено по шагам в отладчике.
А непонятно потому, что полагал, что ..выполнение чего-то там (3)
не наступит, если я повторно вызываю raise и его обрабатываю.
Получается, что обработка этого raise не срабатывает.


 
Snake   (2002-11-05 10:08) [3]

Думается мне, что в FormCreate УЖЕ обрабатывается исключительная ситуация и назад передается как ни в чем не бывало. А если... попробуй так:

procedure TForm1.FormCreate(Sender: TObject);
begin
try
...выполнение чего-то там (1)
...заведомо вызывающее искл. ситуацию для этого примера
except
ShowMessage("оп-ля");
raise Exception.Create("тра-та-та");
end;
...выполнение чего-то там (2)
end;

Хотя почему-то, ж#пой чувствую, что этот код не сработает


 
Zemal   (2002-11-05 10:46) [4]

Ну, что тут можно добавить... всё правильно, raise надо использовать с умом :)... это просто оператор, позволяющий создать объект-исключение, пораждённый от класса EException или его потомков. Для этого можно воспользоваться конструкцией псевдокласса raise Exception.Create("тра-та-та"); и желательно воспользоваться конструкцией on E:Exception do или указать какого класса исключения тебе надо отловить... обращаю внимание, что при отлавливании будут перехвачены и все исключения дочерних классов. Важная особенность: raise без продолжения не сгенерирует ничего, хотя компилятор его и схавает :), но это будет просто пустой и бесполезный оператор :). Вот так-с. Удачи!


 
Zemal   (2002-11-05 10:55) [5]

Ой, мляяяя!!! С утра от твоих ре-рейсов тоже крыша едет! Совсем забыл, мляяя... ну и голова. Если хочешь перевозбудить исключения, то ты должен в блоке exception сделать обработку некоторого класса исключений, а непопавшие исключения перевозбуждаются raise... всё правильно. Ну и пургу я сегодня гоню... :) А можно просто raise поставить и всё будет перевозбуждено... вот.


 
Zemal   (2002-11-05 11:01) [6]

Кстати, а что пытаешься добиться своим raise? Ведь после перевозбуждения исключения его сможет перехватить, в твоём случае, только Application.OnException... или стави два блока вложенных один в другой, в конце-то концов... Или ты думаешь что исключение передастся вызывающей процедуре? Тогда ты глубоко ошибаешься... никуда оно не передастся и перехватить его можно будет только в обработчике исключений на уровне приложения :).


 
kva   (2002-11-05 11:07) [7]

to Snake © (05.11.02 10:08)
Неважно чем, главное правильно... :)
Проверено заранее, не работает.


 
kva   (2002-11-05 11:17) [8]

2 Zemal © (05.11.02 11:01)
>Ведь после перевозбуждения исключения его сможет перехватить,
>в твоём случае, только Application.OnException...

1) Почему только Application.OnException? Откуда это следует?

или стави два блока вложенных один в другой, в конце-то концов...

2) Я полагаю так и сделал, поскольку

try
F1:=TForm1.Create;
except
on E: Exception do
ShowMessage("тра-та-та"+E.Message);
end;


>Или ты думаешь что исключение передастся вызывающей процедуре?
>Тогда ты глубоко ошибаешься... никуда оно не передастся и
>перехватить его можно будет только в обработчике исключений на
>уровне приложения :).
Откуда это следует? Твои слова для меня несут мало информации :(
Факт конечно налицо, но и ты ничего не объясняешь...


 
Рыжик   (2002-11-05 11:30) [9]


> kva (05.11.02 09:04)


> На самом деле происходит:
> 1) ShowMessage("оп-ля");
> 2) ShowMessage("оп-ля");
> и затем идет выполнение чего-то там (3)

Ну, во-первых, на самом деле должно происходить:
1) ShowMessage("оп-ля");
2) Exception, который произошёл во время "выполнения чего-то там (1) заведомо вызывающее искл. ситуацию", а не "оп-ля"
и затем идет выполнение чего-то там (3)

Это происходит потому что:
1)сперва вызывается конструктор F1:=TForm1.Create;
2)сразу после конструктора вызывается вызывается AfterConstruction, который и генерирует OnCreate. AfterConstruction is called automatically after the object’s last constructor has executed. Получается, что сам конструктор F1:=TForm1.Create; отрабатывает без ошибок, а исключение происходит отдельно и не отлавливается в данном блоке:
try
F1:=TForm1.Create;
...выполнение чего-то там (3)
except
on E: Exception do
ShowMessage("тра-та-та"+E.Message);
end;

Можно переопределить конструктор, и туда поместить код из OnCreate, тогда всё отловится:
constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
try
...выполнение чего-то там (1)
...заведомо вызывающее искл. ситуацию для этого примера
except
ShowMessage("оп-ля");
raise;
end;
...выполнение чего-то там (2)
end;
Тогда получим следующее:
1) ShowMessage("оп-ля");
2) ShowMessage("тра-та-та"+E.Message);






 
icWasya   (2002-11-05 11:31) [10]

use source Look!!

Forms.pas
.....
procedure TCustomForm.DoCreate;
begin
if Assigned(FOnCreate) then
try
FOnCreate(Self);<---!!!!!!!!!!!!!!!!!!!!!!!!!
except
Application.HandleException(Self);
end;
if fsVisible in FFormState then Visible := True;
end;
.....


 
kva   (2002-11-05 13:57) [11]

2 Рыжик © (05.11.02 11:30)
Конечно, поспешил и не совсем точно описал.

Спасибо всем!
Особенно Рыжик © (05.11.02 11:30) и
icWasya © (05.11.02 11:31)


 
Кот Бегемот   (2002-11-05 14:04) [12]

Рыжик приветик :)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.11.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.009 c
1-45917
klyonov
2002-11-03 10:53
2002.11.14
Сохранение свойств в поток


14-46129
Феу
2002-10-27 20:34
2002.11.14
Формы Бэкуса-Наура


7-46155
Zergling
2002-09-12 13:00
2002.11.14
POPUP меню в SYSTRAY


14-46070
Николай Быков
2002-10-24 15:35
2002.11.14
http://freeprogrammer.narod.ru


1-45828
Igorek
2002-10-30 20:22
2002.11.14
Стиль: саморазрушение





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский