Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.035 c
14-1084523991
jack128
2004-05-14 12:39
2004.05.30
Растояние от точки до отрезка


1-1085040340
Sour
2004-05-20 12:05
2004.05.30
dxInspector из ExpressInspector Suite


3-1084034065
AVKAR
2004-05-08 20:34
2004.05.30
Lookup-поле


7-1082550689
химик
2004-04-21 16:31
2004.05.30
Как программно добавить язык (раскладку) в системе?


14-1084111140
VID
2004-05-09 17:59
2004.05.30
Как выполнить макрос в Excel ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский