Форум: "Основная";
Текущий архив: 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