Форум: "Основная";
Текущий архив: 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