Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

raise Exception [D7, WinXP]


Страницы:   1 2

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]

Да, вижу.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо