![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
raise Exception [D7, WinXP]
Juice © (2007-02-06 12:06:00)Есть процедура, в ней цикл, в цикле при выполнении определенного логического условия я деляю raise Exception.Create("..."). Обработчиков внутри процедуры никаких нет. Исключительно на одной единственной машине при попадании в это условие генерится исключение и ... продолжает работать цикл !
procedure CalcStateOnDate(ADate : TDate; OriCoupons:TCoupons);
var
i : integer;
CurRate : Extended;
begin
CurRate := 0;
for i:=0 to High(OriCoupons) do
begin
...
else raise Exception.Create('Logical Error in CALCSTATEONDATE [{6084186F-143B-443E-B79A-200E360EBDF5}]');
end;//for i:=0 to High(OriCoupons) ...
end;
GrayFace (2007-02-06 22:01:00) [1]RaiseExceptionProc ты, наверняка, не меняешь? Хотя какой-нибудь странный компонент может и менять.
GrayFace (2007-02-06 21:56:00) [2]tesseract © (06.02.07 12:53) [4]
Потому как не всегда нужно возбуждать raise. Иногда ошибку можно просто задавить.
В крайне редких случаях.
DiamondShark (2007-02-06 19:08:00) [3]
> Я только не могу понять ЧТО и как может повлиять настолько
> чтобы raise который стоит прямо перед except работал таким
> образом, да и еще с разницой под отладчиком оно или нет
> ?
Очень даже простое "ЧТО" -- весь остальной код от begin до raise, который ты поскипал.
Кто тебя знает, может ты там стек портишь.
Juice (2007-02-06 14:37:00) [4]
> разницой
разницЕй
Juice (2007-02-06 14:36:00) [5]Принципаильно нет, принципиально работать и так и так должно. Я только не могу понять ЧТО и как может повлиять настолько чтобы raise который стоит прямо перед except работал таким образом, да и еще с разницой под отладчиком оно или нет ?
Kolan (2007-02-06 14:26:00) [6]> else raise Exception.Create('Logical Error in CALCSTATEONDATE
> [{6084186F-143B-443E-B79A-200E360EBDF5}]');
А возникает ли эксепшн? Може все дело в форматировании кода?
Напиши raise на другой строке...
else
raise Exception.Create('Logical Error in CALCSTATEONDATE [{6084186F-143B-443E-B79A-200E360EBDF5}]');
Сергей М. (2007-02-06 14:21:00) [7]
> Juice © (06.02.07 14:19) [14]
> Так нормально, 1я и все.
>
Ну а чем код в [11] принципиально отличается от твоего кода ? Ничем)
Juice (2007-02-06 14:19:00) [8]
> Сергей М. © (06.02.07 14:11) [13]
Так нормально, 1я и все.
Сергей М. (2007-02-06 14:11:00) [9]
> Juice © (06.02.07 14:05) [12]
см. [11]
запускай без отладчика
?
Juice (2007-02-06 14:05:00) [10]Извиняюсь, я вас малость в заблуждение ввел. Все оказывается еще хуже.
> Сергей М. © (06.02.07 12:16) [1]
-оказалось что вижу только в том случае когда я иду пошагово отладчиком. А не вижу во всех остальных случаях:
1) Если запустить программу отдельно (исп.файл)
2) Если запустить через Run с выкл. Stop On Delphi Exceptions
3) Не вижу даже в том случае когда возникает исключение, происходит отсанов и я нажимаю Run. А если тут нажать StepOver то все нормально, попадаем в обработчик. Ну как вам такое поведение ? Честное слово даю все так и есть, слово в слово.
> А ты с потоками работаешь?
нет.
Сергей М. (2007-02-06 13:36:00) [11]
> мое утверждение истинно на все 100%
Экий ты упрямый)
Пробуй так:
procedure CalcStateOnDate(ADate : TDate; OriCoup
ons:TCoupons);
...
begin
for i:=1 to 2 do begin
ShowMessage(IntToStr(i)+'я итерация цикла');
raise Exception.Create('');
end;
end;
Что видишь ?
> это ноутбук Hewlett-Packard
По барабану что это.
SEH - механизм программный, он специфичен для ОС, а не для железа.
Kolan (2007-02-06 13:35:00) [12]А ты с потоками работаешь?
Juice (2007-02-06 13:27:00) [13]Кстати, это ноутбук Hewlett-Packard
Juice (2007-02-06 13:26:00) [14]
> Сергей М. © (06.02.07 13:15) [7]
Почему же это ? Когда я помещаю код в try ... except это уже совсем другой код. Так что мое утверждение истинно на все 100%, я сказал как есть. Тут на лицо один факт - если исключение самому обернуть в секцию то все нормально, а если нет то стандартный обработчик ведет себя не должным образом.
Сергей М. (2007-02-06 13:15:00) [15]
> Juice © (06.02.07 12:33) [2]
Это означает лишь одно - твое утверждение
> генерится исключение и ... продолжает работать цикл
ложно.
Leonid Troyanovsky (2007-02-06 13:11:00) [16]
> Juice © (06.02.07 13:06) [5]
> Вот именно и интересует это. Нужно или можно ? Ну задавлю
Не нужно и не можно.
> знаю оно не влазит в рамки того как должно быть. Может кто-
> то думает иначе?
Для того, чтобы начать думать нужно больше информации,
чем приведено.
Пока похоже, что у тебя некая наведенная ошибка, т.е.,
возникает она где-то в другом месте,
а в данном - лишь проявляется.
--
Regards, LVT.
Juice (2007-02-06 13:06:00) [17]
> Потому как не всегда нужно возбуждать raise
Вот именно и интересует это. Нужно или можно ? Ну задавлю я ее в данном случае а вылезит в другом неожиданном месте. Интересует с чем связано такое поведение , насколько я знаю оно не влазит в рамки того как должно быть. Может кто-то думает иначе?
tesseract (2007-02-06 12:53:00) [18]
> Так в чем прикол что приходиться делать так:
Потому как не всегда нужно возбуждать raise. Иногда ошибку можно просто задавить.
Juice (2007-02-06 12:44:00) [19]Так в чем прикол что приходиться делать так:
procedure CalcStateOnDate(ADate : TDate; OriCoupons:TCoupons);
...
begin
try
.....
except
raise;
end;
end;
???
Получается, что стандартный обработчик возвращает управление "по-адресу" ? Какая может быть причина почему так происходит?
Juice (2007-02-06 12:33:00) [20]Да, вижу.