Главная страница
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.053 c
14-1084467296
romychk
2004-05-13 20:54
2004.05.30
Не могу настроить TCP IP


3-1083741652
Demoniak
2004-05-05 11:20
2004.05.30
Удаление некоторых записей


3-1083844364
kas
2004-05-06 15:52
2004.05.30
Как получить список MSSQL-серверов, зарегистрированных в сети


1-1084739094
Liona
2004-05-17 00:24
2004.05.30
Как очистить StringGrid?


7-1082626574
Alex_s
2004-04-22 13:36
2004.05.30
Работа с контроллером