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

Вниз

Крыша едет от 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
14-46108
Undert
2002-10-24 21:28
2002.11.14
Windows XP Service Pack 1 !!!


1-45935
Tea_Pot
2002-11-04 01:48
2002.11.14
Как засунуть в *.res - файл 16-и или24-х битную картинку...


14-46093
Николай Быков
2002-10-26 16:52
2002.11.14
Free programmer


14-46066
Фикус
2002-10-25 13:29
2002.11.14
Достал меня AVP!


1-45958
Sergey_Elf
2002-11-04 13:38
2002.11.14
Tdatetimepicker при попытке ввода года вылетает exception