Вниз
Скачать: CL | DM;

try   Найти похожие ветки 

← →
Empleado ©   (2004-05-18 17:23) [0]

Всем привет!

Кто-нибудь объясните мне разницу в результате выполнения данных двух процедур. А именно, почему так происходит?

Вариант 1) С использованием raise
Вариант 2) С использованием div 0


procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
 i := 0;
 try
    //i := 1 div i
    raise Exception.Create("My exception")
 except
    showmessage("in block TRY..EXCEPT")
 end;
 showmessage("Showmessage - after TRY..EXCEPT")
end;

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
 i := 0;
 try
    //i := 1 div i
    raise Exception.Create("My exception")
 finally
    showmessage("in block TRY..FINALLY")
 end;
 showmessage("Showmessage - after TRY..FINALLY")
end;


Gracias


← →
Digitman ©   (2004-05-18 17:31) [1]


> почему так происходит?


а что. собссно, происходит-то ? ... что-то жуткое ?


← →
Palladin ©   (2004-05-18 17:32) [2]

ну и типа справка по finally и except тебе ни о чем не сказала?


← →
zhe   (2004-05-18 17:32) [3]

ни в одном из случаев последний showmessage не должен появляться, чё ту не понятно.

зы: сделайте что-то с вашым тупорылым серваком! ERROR 500!


← →
zhe   (2004-05-18 17:36) [4]

то, что после finally выполнится полюбому, а то что после except, только тогда, когда после верхнего try скурвится какой-нибудь ексепшын. вот и вся ...


← →
begin...end ©   (2004-05-18 17:43) [5]

Последний ShowMessage выполнится в любом из этих двух случаев, поскольку он вообще расположен за пределами блоков try...except...end и try...finally...end.


← →
zhe   (2004-05-18 17:52) [6]

не гони, во втором он хрен выполнится, только в первом случае, я хреново посмортел. потому, как во втором ексэпшын сразу выбивает процедуру(функцию) на фик


← →
Empleado ©   (2004-05-18 18:13) [7]

>Palladin ©   (18.05.04 17:32) [2]
Сказала, сказала... Уже битых полчаса всматриваюсь в хелп, как идиот, чес.слово; и ни фига!
Собственно вопрос от загнанности и настрадалости.
Ты даже не представляешь, сколько раз я читал эту фразу (finally): If an exception is raised during execution of statementList1, control is transferred to statementList2; once statementList2 finishes executing, the exception is re-raised...

Теперь предлагаю такой вариант:


procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
 i := 0;
 try
    i := 1 div i
    //raise Exception.Create("My exception")
 except
    showmessage("in block TRY..EXCEPT")
 end;
 showmessage("Showmessage - after TRY..EXCEPT");
 showmessage("i = " + inttostr(i))
end;

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
 i := 0;
 try
    i := 1 div i
    //raise Exception.Create("My exception")
 finally
    showmessage("in block TRY..FINALLY")
 end;
 showmessage("Showmessage - after TRY..FINALLY");
 showmessage("i = " + inttostr(i))
end;


Вроде все встало на свои места.
Это оптимизатор компилятора заклинил переменную i ? Т.е. он не хотел ни в какую делать ексепшин, если i не использовалась?

Gracias


← →
begin...end ©   (2004-05-18 19:06) [8]

Удалено модератором



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

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.02 c
4-1082095485
Def_E
2004-04-16 10:04
2004.05.30
ShellExecute и пути поиска


14-1084194736
Piter
2004-05-10 17:12
2004.05.30
Кто-нибудь играл в Коммандос-3?


8-1079985708
Cosmit
2004-03-22 23:01
2004.05.30
Delphi и Flash.


6-1081396969
valex1
2004-04-08 08:02
2004.05.30
Отправка через MicroSoft Outlook


14-1084289440
konstantinov
2004-05-11 19:30
2004.05.30
Как создать скомиплированный HTML - файл




   Наверх