Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

Exception + Raise = ????   Найти похожие ветки 

 
62mkv   (2004-05-18 15:21) [0]

Господа, помогите разобраться в чем дело !

имеется две процедуры :
procedure A;
begin
try
.........
 B(par1,,,,,parN);
.........
except
 on E:Exception do
  showmessage("Error in A:"+E.Message);
end
end;

и

procedure B(par1,,,,,,,,parN);
begin
try
try
..........
 if (error_condition) then
  raise Exception.Create("My Exception");
..........
except
 on E:Exception do
  showmessage("Error in B:"+E.Message);
end;
finally
end;
end;

и когда выполняется raise, то обработчик срабатывает ВНУТРИ A:
Error in A: Access violation at address 004A7E72 in module "ATO.exe". Read of address 83565390

документацию всю какую мог перерыл, почему такое бывает ?

Delphi 5, WinXP

Заранее спасибо за любые варианты


 
Курдль ©   (2004-05-18 15:30) [1]

1. Нельзя ли код поаккуратнее выводить?..
2. Зачем писать rasie внутри своего же try - except?
3. Все правильно, т.к. в процедуре В внешний try - finally отлавливает и скрывает (т.к. он не try - except) Ваше же raise .


 
Digitman ©   (2004-05-18 15:34) [2]


> 62mkv


мозги ты нам паришь ... если В() была вызвана в теле А(), и в теле В() при этом возникло "непогашенное" исключение, то , если в теле А() есть обработчик исключений в коде, вызвавшем В(), то он ОБЯЗАТЕЛЬНО получит управление


 
Курдль ©   (2004-05-18 15:49) [3]

Так у него в В все - "супер-погашенные"!
Т.е. даже обработка погашена!
raise вызывается первым же исключением "В", весь остальной код не выполняется, а значит никаких больше исключений не возникает.
А raise посылает исключение внешнему try - finally, который по except ничего не делает (естественно).


 
62mkv   (2004-05-18 15:51) [4]

прочел два ответа, оба не устроили в корне...

насколько я понимаю концепцию исключений, любое исключение обрабатывается в первую очередь БЛИЖАЙШИМ except или finally блоком. в данном случае, finally блок внешний, поскольку он должен выполняться ВСЕГДА даже если исключение возникло. как он может скрадывать управление от ВНУТРЕННЕГО except блока ?

вот ключевая цитата из help:
If an exception is raised during execution of the initial statements list,

either by a raise statement in the statements list
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
or by a procedure or function called from the statements list, an attempt is made to “handle” the exception:

то есть неважно как (raise-ом или иными способами) было вызвано исключение, управление ВСЕГДА должно переходить к ближайшему except-блоку. внешний finally тут ни причем !

я вот сейчас поподробнее разобрался в ситуации, оказывается при вызове showmessage внутри except обработчика B возникает exception, который в итоге и обрабатывается в A !

так что это были две разные ошибки..

спасибо всем !

PS: а мозги я не парил.. только что себе самому..


 
Digitman ©   (2004-05-18 15:56) [5]


> Курдль ©   (18.05.04 15:49) [3]



> Так у него в В все - "супер-погашенные"!


об чем и речь .. т.е. явно мозги парит ..

в В() в блоке try он выполнил raise, здесь же, в блоке except и "погасил" искл-е ... и уж никак оно, коль скоро погашено было в В(), не могло попасть в обработчик блока except в А()


 
Курдль ©   (2004-05-18 15:58) [6]


> PS: а мозги я не парил.. только что себе самому..

Ок! Это я тебе мозги парил! Извини - не врубился, что твое raise не внутри except-а стоит. :)
Однако я удивлен странным поведением ShowMessage...


 
Digitman ©   (2004-05-18 16:02) [7]


> 62mkv   (18.05.04 15:51) [4]


> оказывается при вызове showmessage внутри except обработчика
> B возникает exception


тогда все понятно... паришь мозги ты потому, что, не разобравшись сразу, совершенно иное исключение выдаешь за ожидаемое по raise ...

кр.того, я не верю, что строчка showmessage("Error in B:"+E.Message), вызванная в контексте осн.потока . могла вызвать AV - ну нечему там просто быть причиной AV !!



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

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.052 c
14-1083873348
SeriousSam
2004-05-06 23:55
2004.05.30
Подключайтесь!


8-1079429376
Monk-Warrior
2004-03-16 12:29
2004.05.30
Размещение на форме картинки в формате gif


3-1084135839
Execute
2004-05-10 00:50
2004.05.30
ПРоблема с поучениям ID


1-1084961468
saysu
2004-05-19 14:11
2004.05.30
Как в делфи писать на казахском языке?


3-1083912885
Goida
2004-05-07 10:54
2004.05.30
Использование параметров в ADOQuery