Текущий архив: 2004.10.24;
Скачать: CL | DM;
ВнизМножество try except finally ? Найти похожие ветки
← →
QuestionX (2004-10-02 19:16) [0]Как считаете, насколько влияет большое число вложенных try except finally структур на производительность кода ?
← →
TUser © (2004-10-02 19:20) [1]А что такое "производительность кода"?
ИМХО - сколько надо, столько и вкладывай.
← →
Sergey_Masloff (2004-10-02 19:21) [2]finally практически не влияет. except "тяжелее" но как правило лишняя защищенная секция. Для интерактивных приложений вообще проблемы производительности не так актуальны.
← →
GuAV © (2004-10-02 19:22) [3]я считаю что множество try finally нормально. try except тоже нужно но редко, множество их - ненормально.
Тормозит это имхо больше вслучае исключений, в случае их отсутствия имхо не сильно тормозит.
← →
Sergey_Masloff (2004-10-02 19:23) [4]GuAV ©
Разработчики VCL с тобой солидарны - finally встречается на порядок чаще except я когда-то давно интересовался проблемой и смотрел.
← →
Sergey_Masloff (2004-10-02 19:24) [5]>но как правило лишняя защищенная секция.
лучше чем одна недостающая...
Имелось в виду. Поторопился.
← →
Anatoly Podgoretsky © (2004-10-02 19:51) [6]Не из торможения надо исходить, а из надежности
← →
QuestionX (2004-10-02 20:06) [7]
> Anatoly Podgoretsky © (02.10.04 19:51) [6]
> Не из торможения надо исходить, а из надежности
Золотые слова ;)
> Sergey_Masloff (02.10.04 19:21) [2]
> finally практически не влияет. except "тяжелее"
А откуда такая информация ? Разве технически это не одно и тоже ?
← →
GuAV © (2004-10-02 20:26) [8]
> Не из торможения надо исходить, а из надежности
Да, надёжность прежде всего. И так в программе есть ошибки.
Однако не следует использовать исключения не по назначинию.
Типа есть такое, когда выходят не через break/exit/goto а raise а потом except. так делать не следует.
кстати, провёл тест результат впечатляет:procedure DoNothing;
asm
NOP; NOP; NOP; NOP;
NOP; NOP; NOP; NOP;
NOP; NOP; NOP; NOP;
end;
procedure NoTry;
begin
DoNothing;
DoNothing;
end;
procedure TryFinally;
begin
try
DoNothing;
finally
DoNothing;
end;
end;
procedure TryXcept;
begin
try
DoNothing;
DoNothing;
except
end;
end;
procedure TryXceptR;
begin
try
DoNothing;
DoNothing;
raise Exception.Create("test exception");
except
end;
end;
const procs: array[0..3] of procedure=
(NoTry, TryFinally, TryXcept, TryXceptR);
procedure TForm1.Button1Click(Sender: TObject);
var
T, TestCount : Cardinal; P: procedure;
i, j: Integer; i1, i2 : tcolor;
begin
TestCount:= 1000000;
for j:=Low(procs) to High(procs) do
begin
p:=procs[j];
T := GetTickCount;
for i := 0 to TestCount do p;
T := GetTickCount - T;
if j= High(procs) then TestCount:=TestCount div 1000;
Memo1.Lines.Add(Format("procs[%d] - %d",[j, T]));
end;
end;
procs[0] - 15
procs[1] - 44
procs[2] - 28
procs[3] - 7805 // умножь ещё на 1000
← →
Sergey_Masloff (2004-10-02 20:28) [9]QuestionX (02.10.04 20:06) [7]
>Разве технически это не одно и тоже ?
Нет
← →
Sergey_Masloff (2004-10-02 20:44) [10]GuAV © (02.10.04 20:26) [8]
Странно. Твой пример правильный но результат на моем компьютере:
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 31
procs[1] - 32
procs[2] - 15
procs[3] - 3000
procs[0] - 16
procs[1] - 47
procs[2] - 15
procs[3] - 3000
procs[3] - 3000
procs[0] - 31
procs[1] - 32
procs[2] - 15
procs[3] - 3000
procs[0] - 31
procs[1] - 32
procs[2] - 15
procs[3] - 3000
procs[0] - 31
procs[1] - 32
procs[2] - 15
procs[3] - 3000
То есть обычно
NoTry = TryFinally
но эпизодически TF намного дольше и опять одинаково. Когда Exception возникаеттам все понятно конечно.
← →
GuAV © (2004-10-02 20:54) [11]
> procs[0] - 31
> procs[1] - 31
> procs[2] - 16
то есть, excpet бытрее чем просто ???
скорее всего у Вас крутой комп и кэш в нём настолько эффективен.
имхо следует перед тестом погонять DoNothing раз этак 5..6
← →
lipskiy © (2004-10-02 20:56) [12]Люди, поясните коротко, чем except и finally отличаются? И когда что использовать нужно?
← →
GuAV © (2004-10-02 20:58) [13]lipskiy © (02.10.04 20:56) [12]
смотри мою анкету - внизу.
← →
DrPass © (2004-10-02 22:21) [14]
> Люди, поясните коротко, чем except и finally отличаются?
> И когда что использовать нужно?
секция except - это код, который должен выполняться при возникновении исключения.
Секция finally - это код, который должен выполняться независимо от того, произошло исключение, или нет
← →
jack128 © (2004-10-02 23:05) [15]GuAV © (02.10.04 20:26) [8]
Ты - вредитель!! ;-))
Народ со слабыми компами - если захотите запустить тест ГуАВ, то запускайте его ВНЕ IDE
← →
GuAV © (2004-10-02 23:08) [16]Не-а необязательно, нужно только отключить интегрированную отладку... надеюсь помнишь как ?
← →
QuestionX (2004-10-02 23:34) [17]
> Sergey_Masloff (02.10.04 20:28) [9]
> finally практически не влияет. except "тяжелее"
Странно, но из
> Sergey_Masloff (02.10.04 20:44) [10]
> результат на моем компьютере:
> procs[0] - 31
> procs[1] - 31 <--- Finally
> procs[2] - 16 <--- Except
> procs[3] - 3000
Получается, что finally тормознее except"a !
Еще раз поинтересуюсь, откуда у вас информация, что except "тяжелее" ?
← →
Sergey_Masloff (2004-10-02 23:45) [18]QuestionX (02.10.04 23:34) [17]
>Еще раз поинтересуюсь, откуда у вас информация, что >except "тяжелее" ?
Из понимания смысла этих операций. Для finally нужно всего лишь записать адрес начала блока так как в except требуется формирование фрейма исключения ведь нужно будет раскручивать стек для продолжения "нормальной" работы после исключения. И пример procs[3] это наглядно показывает
← →
Sergey_Masloff (2004-10-02 23:47) [19]Кстати точно. Там различие сильное будет на обработке стека. Так что нужно тестировать на процедурах с параметрами. Еще лучше когда одна процедура будет вызываться из другой. Там except должен быть намного тормознее.
← →
GuAV © (2004-10-02 23:49) [20]Sergey_Masloff (02.10.04 23:45) [18]
ещё раз повторите тест на Р4 плиз с учётом [11], а то что Except быстрее "просто" наводит на сомнения в объективноти
← →
GuAV © (2004-10-02 23:51) [21]и ваще, хочу коментарии по поводу результатов в [10].
← →
lipskiy © (2004-10-02 23:52) [22]DrPass © (02.10.04 22:21) [14]
Тенкс!
← →
Sergey_Masloff (2004-10-03 00:23) [23]GuAV © (02.10.04 23:49) [20]
>ещё раз повторите тест на Р4 плиз с учётом [11],
Проверил. Delphi7, оптимизация отключена, DoNothing 6 раз перед каждым тестом. Кстати любопытная деталь - каждый раз когда TF больше (примерно на 15) тут же примерно на 15 "меньше" простой вызов. Что-то может не так меряем?
procs[0] - 32
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 31
procs[1] - 32
procs[2] - 15
procs[3] - 3000
procs[0] - 31
procs[1] - 32
procs[2] - 15
procs[3] - 3000
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 15
procs[1] - 47
procs[2] - 16
procs[3] - 2984
procs[0] - 15
procs[1] - 47
procs[2] - 16
procs[3] - 3937
procs[0] - 31
procs[1] - 31
procs[2] - 32
procs[3] - 3937
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 16
procs[1] - 47
procs[2] - 15
procs[3] - 3000
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 15
procs[1] - 47
procs[2] - 16
procs[3] - 3000
procs[0] - 31
procs[1] - 31
procs[2] - 32
procs[3] - 2984
procs[0] - 15
procs[1] - 47
procs[2] - 16
procs[3] - 2984
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 16
procs[1] - 47
procs[2] - 15
procs[3] - 2985
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
← →
GuAV © (2004-10-03 00:37) [24]
> Что-то может не так меряем?
хм... Вы на кнопку Enterом давите, мышу не двигаете ?
а что если дать задержку перед первым тестом ?
← →
Sergey_Masloff (2004-10-03 00:50) [25]GuAV © (03.10.04 00:37) [24]
Ну на кнопку я давлю мышем но 1 раз (сделал еще 1 цикл внешни 10 раз). Попробовал и давить кнопкой - то же самое. Сейчас привожу последний на данный момент результат - мыш не шевелилась перед каждым тестом DoNothing 6 раз и Sleep(100) - это имелось в виду под задержкой?
procs[0] - 15
procs[1] - 32
procs[2] - 31
procs[3] - 2922
procs[0] - 16
procs[1] - 46
procs[2] - 16
procs[3] - 2938
procs[0] - 15
procs[1] - 32
procs[2] - 31
procs[3] - 2922
procs[0] - 16
procs[1] - 31
procs[2] - 31
procs[3] - 2922
procs[0] - 16
procs[1] - 31
procs[2] - 31
procs[3] - 2922
procs[0] - 15
procs[1] - 31
procs[2] - 32
procs[3] - 2937
procs[0] - 16
procs[1] - 31
procs[2] - 32
procs[3] - 2921
procs[0] - 15
procs[1] - 32
procs[2] - 31
procs[3] - 2937
procs[0] - 15
procs[1] - 31
procs[2] - 32
procs[3] - 2922
procs[0] - 15
procs[1] - 32
procs[2] - 31
procs[3] - 2937
procs[0] - 15
procs[1] - 47
procs[2] - 16
procs[3] - 2922
← →
GuAV © (2004-10-03 00:53) [26]Ну так лучше же результаты - procs[0] самая быстрая.
а если ещё нолик добавить ?TestCount:= 1000000*10;
...TestCount div 1000*10;
← →
Sergey_Masloff (2004-10-03 01:08) [27]GuAV © (03.10.04 00:53) [26]
Вот.
procs[0] - 219
procs[1] - 390
procs[2] - 172
procs[3] - 32453
procs[0] - 218
procs[1] - 391
procs[2] - 172
procs[3] - 29671
procs[0] - 219
procs[1] - 391
procs[2] - 172
procs[3] - 29703
procs[0] - 219
procs[1] - 390
procs[2] - 172
procs[3] - 29703
procs[0] - 218
procs[1] - 391
procs[2] - 172
procs[3] - 29687
procs[0] - 218
procs[1] - 407
procs[2] - 171
procs[3] - 29688
procs[0] - 219
procs[1] - 391
procs[2] - 156
procs[3] - 29704
procs[0] - 219
procs[1] - 390
procs[2] - 172
procs[3] - 29703
procs[0] - 219
procs[1] - 390
procs[2] - 172
procs[3] - 29672
procs[0] - 219
procs[1] - 391
procs[2] - 172
procs[3] - 29687
procs[0] - 219
procs[1] - 391
procs[2] - 172
procs[3] - 29750
← →
GuAV © (2004-10-03 01:10) [28]Sergey_Masloff (03.10.04 01:08) [27]
мда...
а Вы можете прокоментировать ?
ЗЫ: а если попробовать вызывать в другом (случайном) порядке ?
← →
QuestionX (2004-10-03 01:11) [29]
> Sergey_Masloff (02.10.04 23:45) [18]
> QuestionX (02.10.04 23:34) [17]
> >Еще раз поинтересуюсь, откуда у вас информация, что >except
> "тяжелее" ?
> Из понимания смысла этих операций. Для finally нужно всего
> лишь записать адрес начала блока так как в except требуется
> формирование фрейма исключения ведь нужно будет раскручивать
> стек для продолжения "нормальной" работы после исключения.
> И пример procs[3] это наглядно показывает
Пример из procs[3] наглядно показывает только то, что при возникновении исключения его обработка занимает продолжительное время. Но исплючительная ситуация на то и исключительная, что когда она возникает - значит что-то не в порядке и быстродействие в этом случает меня не сильно волнует. Я задал конретный вопрос о том, насколько нагружает быстродействие введение в него блоков try except finally а не насколько нагружает быстродействие возникшее исключение.
Пример же из procs[0 - 2] показывают, что вопреки вашему утверждению блок try-except не "тяжелее" try-finally (а даже легче). Или я не прав ?
← →
GuAV © (2004-10-03 01:14) [30]
> Пример же из procs[0 - 2] показывают, что вопреки вашему
> утверждению блок try-except не "тяжелее" try-finally (а
> даже легче). Или я не прав ?
Вероятно, легче. Но ведь один другого не заменят.
Впрочем я или нахожу объяснение почему procs[2] быстрее procs[0] или результаты считаю ошибочными.
← →
Sergey_Masloff (2004-10-03 01:15) [31]GuAV © (03.10.04 01:10) [28]
>а Вы можете прокоментировать ?
Нет. Но понимаю что чудес не бывает
>ЗЫ: а если попробовать вызывать в другом (случайном) порядке ?
Пробовал. Правда не в случайном а просто последовательность менял. Результат ровно такой же.
← →
Sergey_Masloff (2004-10-03 01:18) [32]QuestionX (03.10.04 01:11) [29]
Не прав ;-)
Ну или если все Ваши проекты состоят из не принимающих параметров процедур тело которых состоит исключительно из NOP то ;-)
При except будет много тратиться на обеспечение раскрутки стека. Просто в нашем конкретном случае стека нет а такты на запоминания адреса входа в файнали тратятся. Попробуйте поэкспериментировать с процедурами с параметрами (еще лучше с рекурсией).
← →
GuAV © (2004-10-03 01:20) [33]
procedure TForm1.Button1Click(Sender: TObject);
var
T, TestCount : Cardinal; P: procedure;
i, j: Integer; i1, i2 : tcolor;
begin
TestCount:= 10000000;
for j:=Low(procs) to High(procs) do
begin
p:=procs[j];
if j= High(procs) then TestCount:=TestCount div 100;
T := GetTickCount;
for i := 0 to TestCount do p;
T := GetTickCount - T;
Memo1.Lines.Add(Format("procs[%d] - %d",[j, T]));
end;
end;
у меня такой результат:procs[0] - 183
procs[1] - 454
procs[2] - 245
procs[3] - 841
А Вы выключили &Integrated debugging (Tools->Debugging Options) ?
← →
GuAV © (2004-10-03 01:31) [34]реальная ситуация - вместо DoNothing использованна процедура из ветки про быстрый поиск PosDefunct_a(S1, S2);
результат:procs[0] - 630
procs[1] - 915
procs[2] - 695
procs[3] - 905
:confused:
← →
Sergey_Masloff (2004-10-03 01:33) [35]GuAV © (03.10.04 01:20) [33]
>А Вы выключили &Integrated debugging (Tools->Debugging >Options) ?
У меня сняты все галки в Compiler->Debugging так что Integrated не при чем. Впрочем ради интереса попробовал - не влияет абсолютно.
← →
Sergey_Masloff (2004-10-03 01:36) [36]Только что попробовал:
procedure DoNothing(AHandle : THandle);
begin
PostMessage(AHandle, WM_MY, 0, 0);
end;
и
finally
On E: Exception do
DoNothing(Aoolication.MainForm.Handle);
end;
procs[0] - 609
procs[1] - 625
procs[2] - 625
procs[3] - 3625
procs[0] - 609
procs[1] - 625
procs[2] - 625
procs[3] - 3625
procs[0] - 609
procs[1] - 625
procs[2] - 625
procs[3] - 3625
procs[0] - 609
procs[1] - 625
procs[2] - 610
procs[3] - 3625
procs[0] - 609
procs[1] - 620
procs[2] - 625
procs[3] - 3625
procs[0] - 609
procs[1] - 625
procs[2] - 625
procs[3] - 3625
← →
GuAV © (2004-10-03 01:37) [37]
> Впрочем ради интереса попробовал - не влияет абсолютно.
Разве &Stop on Delphi Exceptions на третьей вкладке не влияет (если вместе с &Integrated debugging включена) ?
← →
GuAV © (2004-10-03 01:39) [38]
> finally
> On E: Exception do
> DoNothing(Aoolication.MainForm.Handle);
> end;
не надо было On E: Exception do, не поднимается же исключение...
зы не знал что в finally тоже on писать можно , ща проверю...
← →
Sergey_Masloff (2004-10-03 01:41) [39]GuAV © (03.10.04 01:37) [37]
Я ж не в IDE запускаю. Нет не влияет.
← →
GuAV © (2004-10-03 01:42) [40]
> finally
> On E: Exception do
> DoNothing(Aoolication.MainForm.Handle);
> end;
нет ткаое не пойдёт. ошибка:
[Error] Unit1.pas(582): Undeclared identifier: "on"
[Error] Unit1.pas(582): "END" expected but "DO" found
[Error] Unit1.pas(584): "." expected but ";" found
[Fatal Error] Project1.dpr(5): Could not compile used unit "Unit1.pas"
← →
Sergey_Masloff (2004-10-03 01:42) [41]GuAV © (03.10.04 01:39) [38]
Нет в finally нельзя конечно. В эксцепт нужно я просто не то написал
← →
GuAV © (2004-10-03 01:43) [42]
> Я ж не в IDE запускаю.
так бы сразу и сказали :)
а всё же интересный результат с DoNothing :)
← →
QuestionX (2004-10-03 01:45) [43]
> Sergey_Masloff (03.10.04 01:18) [32]
> Не прав ;-)
> При except будет много тратиться на обеспечение раскрутки
> стека. Просто в нашем конкретном случае стека нет а такты
> на запоминания адреса входа в файнали тратятся. Попробуйте
> поэкспериментировать с процедурами с параметрами (еще лучше
> с рекурсией).function DoSomething(A, B, C, X: Integer): Integer;
begin
if X > 0 then
Result := A * B * C * DoSomething(A, B, C, X - 1)
else
Result := X;
end;
procedure NoTry;
begin
DoSomething(1, 1, 1, 20);
DoSomething(1, 1, 1, 20);
end;
procedure TryFinally;
begin
try
DoSomething(1, 1, 1, 20);
finally
DoSomething(1, 1, 1, 20);
end;
end;
procedure TryXcept;
begin
try
DoSomething(1, 1, 1, 20);
DoSomething(1, 1, 1, 20);
except
end;
end;
const procs: array[0..2] of procedure=
(NoTry, TryFinally, TryXcept);
procedure TForm1.Button1Click(Sender: TObject);
var
T, TestCount : Cardinal; P: procedure;
i, j: Integer; i1, i2 : tcolor;
begin
TestCount:= 1000000;
for j:=Low(procs) to High(procs) do
begin
p:=procs[j];
T := GetTickCount;
for i := 0 to TestCount do p;
T := GetTickCount - T;
if j= High(procs) then TestCount:=TestCount div 1000;
Memo1.Lines.Add(Format("procs[%d] - %d",[j, T]));
end;
end;
Результаты:
procs[0] - 1265
procs[1] - 1344 // finally
procs[2] - 1281 // except
Или я все-таки не прав ??? :))
← →
Sergey_Masloff (2004-10-03 01:49) [44]QuestionX (03.10.04 01:45) [43]
>Или я все-таки не прав ??? :))
Да фиг знает. Все же у меня впечетление что что-то не то мы меряем.
Кстати а если cdecl и stdcall поставить изменятся результаты? Я пока не пробовал.
← →
QuestionX (2004-10-03 01:56) [45]Поставил stdcall на DoSomthing:
procs[0] - 1282
procs[1] - 1312
procs[2] - 1266
← →
QuestionX (2004-10-03 01:57) [46]cdecl на время не повлияло
procs[0] - 1266
procs[1] - 1313
procs[2] - 1281
← →
Sergey_Masloff (2004-10-03 02:01) [47]QuestionX (03.10.04 01:56) [45]
У меня (пример из [43] ):
1) Обычный вызов (register)
procs[0] - 515
procs[1] - 516
procs[2] - 516
(повторяется стабильно)
2) stdcall
procs[0] - 531
procs[1] - 562
procs[2] - 547
3) cdecl
procs[0] - 532
procs[1] - 546
procs[2] - 552
Вобщем на cdecl только except проигрывает. Вобщем, какая-то фигня надо думать в чем дело.
← →
Sergey_Masloff (2004-10-03 02:04) [48]QuestionX
Самое интересное что только на твоем примере из [43] у меня стабильно оказалось что вообще ничего не влияет - я прогнал сейчас 100 раз в цикле получил 2 раза
procs[0] - 515
procs[1] - 516
procs[2] - 516
и 98 раз
procs[0] - 516
procs[1] - 516
procs[2] - 516
Ну это вообще непонятно лично мне. Есть соображения?
← →
Sergey_Masloff (2004-10-03 02:07) [49]В смысле при register
← →
QuestionX © (2004-10-03 02:44) [50]Ну если посмотреть ассемблерные листинги:
procedure NoTry;
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
ret
procedure TryFinally;
// begin
push ebp
mov ebp,esp
//try
xor eax,eax
push ebp
push $0044fcdf
push dword ptr fs:[eax]
mov fs:[eax], esp
// DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
xor eax,eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
push $0044fce6
// (1) DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
ret
$0044fcdf:
jmp @HandleFinally
jmp -$1e // goto (1)
$0044fce6:
pop ebp
ret
procedure TryExcept;
// begin
push ebp
mov ebp,esp
push ebx
push esi
push edi
// try
xor eax,eax
push ebp
push $0044fd32
push dword ptr fs:[eax]
mov fs:[eax], esp
// DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
// DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
xor eax,eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
jmp +$0a // goto (2)
$0044fd32: jmp @HandleAnyException
call @DoneExcept
// (2)
pop edi
pop esi
pop ebx
pop ebp
ret
← →
QuestionX © (2004-10-03 02:49) [51]При неслабом компьютере это и будет практически одинаково
← →
GuAV © (2004-10-03 15:10) [52]procedure TryFinally;
// begin
push ebp
mov ebp,esp
//try
xor eax,eax
push ebp
push $0044fcdf
push dword ptr fs:[eax]
mov fs:[eax], esp
// DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
xor eax,eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
push $0044fce6
// (1) DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
ret // Normally executed and jumps to ...
$0044fcdf:
jmp @HandleFinally
jmp -$1e // goto (1)
$0044fce6: // ... here
pop ebp
ret
procedure TryExcept;
// begin
push ebp
mov ebp,esp
push ebx
push esi
push edi
// try
xor eax,eax
push ebp
push $0044fd32
push dword ptr fs:[eax]
mov fs:[eax], esp
// DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
// DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
xor eax,eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
jmp +$0a // goto (2) // Normally executed and jumps to ...
$0044fd32: jmp @HandleAnyException
call @DoneExcept
// (2) // ... here
pop edi
pop esi
pop ebx
pop ebp
ret
В выделенном причина.
В процедуре с Finally используется ret для выхода из finally.
Ещё раз смотрим самую нижнюю строку в моей анкете.
> блок try-except не "тяжелее" try-finally (а даже легче).
> Или я не прав ?
Вы правы. блок try-except легче в случае отсутствия исключения. Однако в случае наличия - неизвестно, требует проверки.
Страницы: 1 2 вся ветка
Текущий архив: 2004.10.24;
Скачать: CL | DM;
Память: 0.6 MB
Время: 0.034 c