![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Крыша едет от re-raise [D5, NT4]
kva © (2002-11-05 09:04:00)Привет всем! Не понимаю выполнение следующего кода, кто может растолковать, откликнитесь.
Есть два участка:
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 отрабатывает не так как я представлял;
или у меня крыша поехала.
Возможно сочетание указанных вариантов :)
Кот Бегемот (2002-11-05 14:04:00) [1]Рыжик приветик :)
kva (2002-11-05 13:57:00) [2]2 Рыжик © (05.11.02 11:30)
Конечно, поспешил и не совсем точно описал.
Спасибо всем!
Особенно Рыжик © (05.11.02 11:30) и
icWasya © (05.11.02 11:31)
icWasya (2002-11-05 11:31:00) [3]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;
.....
Рыжик (2002-11-05 11:30:00) [4]
> 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);
kva (2002-11-05 11:17:00) [5]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;
>Или ты думаешь что исключение передастся вызывающей процедуре?
>Тогда ты глубоко ошибаешься... никуда оно не передастся и
>перехватить его можно будет только в обработчике исключений на
>уровне приложения :).
Откуда это следует? Твои слова для меня несут мало информации :(
Факт конечно налицо, но и ты ничего не объясняешь...
kva (2002-11-05 11:07:00) [6]to Snake © (05.11.02 10:08)
Неважно чем, главное правильно... :)
Проверено заранее, не работает.
Zemal (2002-11-05 11:01:00) [7]Кстати, а что пытаешься добиться своим raise? Ведь после перевозбуждения исключения его сможет перехватить, в твоём случае, только Application.OnException... или стави два блока вложенных один в другой, в конце-то концов... Или ты думаешь что исключение передастся вызывающей процедуре? Тогда ты глубоко ошибаешься... никуда оно не передастся и перехватить его можно будет только в обработчике исключений на уровне приложения :).
Zemal (2002-11-05 10:55:00) [8]Ой, мляяяя!!! С утра от твоих ре-рейсов тоже крыша едет! Совсем забыл, мляяя... ну и голова. Если хочешь перевозбудить исключения, то ты должен в блоке exception сделать обработку некоторого класса исключений, а непопавшие исключения перевозбуждаются raise... всё правильно. Ну и пургу я сегодня гоню... :) А можно просто raise поставить и всё будет перевозбуждено... вот.
Zemal (2002-11-05 10:46:00) [9]Ну, что тут можно добавить... всё правильно, raise надо использовать с умом :)... это просто оператор, позволяющий создать объект-исключение, пораждённый от класса EException или его потомков. Для этого можно воспользоваться конструкцией псевдокласса
raise Exception.Create("тра-та-та");и желательно воспользоваться конструкциейon E:Exception doили указать какого класса исключения тебе надо отловить... обращаю внимание, что при отлавливании будут перехвачены и все исключения дочерних классов. Важная особенность: raise без продолжения не сгенерирует ничего, хотя компилятор его и схавает :), но это будет просто пустой и бесполезный оператор :). Вот так-с. Удачи!
Snake (2002-11-05 10:08:00) [10]Думается мне, что в FormCreate УЖЕ обрабатывается исключительная ситуация и назад передается как ни в чем не бывало. А если... попробуй так:
procedure TForm1.FormCreate(Sender: TObject);
begin
try
...выполнение чего-то там (1)
...заведомо вызывающее искл. ситуацию для этого примера
except
ShowMessage("оп-ля");
raise Exception.Create("тра-та-та");
end;
...выполнение чего-то там (2)
end;
Хотя почему-то, ж#пой чувствую, что этот код не сработает
kva (2002-11-05 09:59:00) [11]Неправда ваша Andrey007 (05.11.02 09:42)
1)Форма НЕ создается автоматически, а только по Create. Пройдено по шагам в отладчике.
А непонятно потому, что полагал, что ..выполнение чего-то там (3)
не наступит, если я повторно вызываю raise и его обрабатываю.
Получается, что обработка этого raise не срабатывает.
Andrey007 (2002-11-05 09:42:00) [12]А мне не понятно чего Вам не понятно. Всё должно быть именно так, как Вы и описали.
А 2 раза "оп-ля" появляется потому, что первый раз TForm1.FormCreate вызывается когда форма создаётся автоматически, а второй раз - когда выполняется строчка F1:=TForm1.Create;