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

Вниз

Как поймать исключение ?   Найти похожие ветки 

 
Альф   (2005-09-22 11:51) [0]

Столкнулся с тем что не могу перехватить обработку исключения в следующей ситуации:
- есть компонент импортированный из OCX.
- форма на которой этот компонент расположен.
- написан обработчик на Application.OnException.
При создании этой формы через Application.CreateForm(...) вываливается окошко с заголовком "Application Error" и текстом "Exception EOleSysError in module ... at xxxx. Класс не зарегистрирован."
Это происходит когда на клиентской машине не установлен/не зарегистрирован этот *.ocx.  
Проблема в том что никак не могу перехватить это сообщение, хотя все остальные исключитальные ситуации с успехом попадают в мой ExceptHandler.


 
Digitman ©   (2005-09-22 11:58) [1]


> обработчик на Application.OnException.


> Application.CreateForm(...)


это все в dpr происходит ?

покажи, в каком порядке ...


 
Альф   (2005-09-22 12:14) [2]


 Application.Initialize();
 with T_startuperr.Create(nil) do begin // вот тут ставиться Application.OnException := ExceptHandler;
   Application.CreateForm(T_main_tst, _main_tst); // всё Ok
   Application.CreateForm(T_data, _data); // всё Ok
   Application.CreateForm(T_dataOcx, _dataOcx); // вот тут при нажатии F8 ловим вышеозначенное окно
   CheckError(); // а тут стоит Application.Terminate();
 end;
 Application.Run();

При добавлении в FormCreate любой формы из T_main_tst, T_data кода вида raise EXXXError.Create("T_main_tst.FormCreate"); попадаем в мой ExceptHandler, только кроме создания  _dataOcx :(
Вероятно это происходит при создании компонента - но отловить это как ???


 
Альф   (2005-09-22 12:22) [3]

дополнение

Application.CreateForm(T_dataOcx, _dataOcx); // вот тут при нажатии F8 ловим вышеозначенное окно

и в T_dataOcx.FormCreate(...) не попадаем и при нажатии <Ok> глухо виснем...


 
Digitman ©   (2005-09-22 12:27) [4]

пробуй так:

try
Application.CreateForm(T_dataOcx, _dataOcx);
exception
 on e:exception do begin
  ShowMessage("Исключение : " + e.ClassName + " " + e.Message);
  raise;
 end;
end;

сообщение видишь ?


 
Digitman ©   (2005-09-22 12:31) [5]


> в T_dataOcx.FormCreate(...) не попадаем


здесь нет ничего удивительного.

событие OnCreate возбуждается лишь при условии и ПОСЛЕ того как будут успешно сконструированы все без исключения компоненты, брошенные тобой на форму в дизайн-тайм .. а поскольку при конструировании ocx-компонента возникла никак необработанная искл.ситуация, до вызова OnCreate-обработчика дело попросту не доходит


 
umbra ©   (2005-09-22 12:36) [6]

Если ты используешь активэксы, то скорее всего у тебя в юзесах есть ComObj. Так вот он имеет секцию инициализации, которая присваивает переменной InitProc ссылку на процедуру. Это значит, что в Application.Initialize что-то происходит и исключение случается именно там! Включи Application.Initialize в try.


 
Альф   (2005-09-22 12:46) [7]

Сделал как сказал, только  ShowMessage заменил на MessageBox.
Немножко изменилась реакция :)
Запускаем
Выскакивает окошко "Исключение....
Песочные часы сек на 2-3
Стандартная форма Windows "В приложении ... обнаружена ошибка. Приложение будет закрыто."
Всё то же окошко с заголовком "Application Error"
При нажатии <Ok> висим ...
Снимаем через Task Manager :)

Причем это не зависит от наличия/присутсвия  raise; в обработке ...


 
umbra ©   (2005-09-22 12:57) [8]

Что-то вроде

try
Application.Initialize;
except
on E:EOleSysError do
begin
ShowMessage(E.Message);
exit;
end;
end;


 
Альф   (2005-09-22 13:01) [9]

Дополнение

 try
   Application.CreateForm(T_dataR3, _dataR3);
 except
    on e:exception do begin
     MessageBox(0,"Исключение",nil,MB_OK);
//      raise;
    end;
 end;

если убрать raise; - то получаем silent исключение, но поймать его всё же пока не получается


 
Digitman ©   (2005-09-22 13:20) [10]


> если убрать raise; - то получаем silent исключение


поясни ...

получив при возникновении исключения управление в except-блоке ты либо "гасишь" это исключение (по по нормальному завершению работы except-блока - под silent именно это имелось ввиду ?) либо перевозбуждаешь его по raise .. третьего не дано


 
Digitman ©   (2005-09-22 13:23) [11]


> ShowMessage заменил на MessageBox


зачем ?

у тебя есть сомнения, что тело exсept-блока выполняется в том же потоке, в котором исключение и было возбуждено (т.е. в дан.случае - основном потоке, в котором была попытка создания формы) ?


 
Альф   (2005-09-22 14:13) [12]

Да - исключение просто гаситься

>> ShowMessage заменил на MessageBox
>зачем ?
нет - сомнений нету никаких, лень было Dialogs прописывать :)


 
Альф   (2005-09-22 14:22) [13]

Сергей (два Сергея ;) ) мне прям неудобно что отвечаете только Вы.
Может ну его ...
Внести в документацию как  "feature" :)))


 
Альф   (2005-09-22 17:05) [14]

Большое всем спасибо !!!
Проблема решена с помощью Mystic-а © за что ему огромное человеческое спасибо.


 
Digitman ©   (2005-09-22 17:07) [15]


> Альф   (22.09.05 17:05) [14]


колись уже ?)

таки любопытно все ж ...


 
Альф   (2005-09-22 17:26) [16]

В двух словах и насколько я понял:
эксперементальным путем выяснили что окошко ошибки - это MessageBox из процедуры SysUtils.ShowException(...)
но сначала я думал что эта SysUtils.ShowException вызывается в TApplication.HandleException(...), тогда было странно видеть как EOleSysError не могло пройти проверку if ExceptObject is Exception - но я оказался неправ !!!
оказалось что данное исключение не возникает внутри TApplication а возникаем при вызове вида

 OleCheck(CoGetClassObject(IMy, CLSCTX_INPROC_SERVER or
     CLSCTX_LOCAL_SERVER, nil, IClassFactory2, V));

где IMy - интерефейс с неизвесным системе UID;
ближайший источник вызова процедуры SysUtils.ShowException(...) оказался там же в SysUtilsExceptProc := @ExceptHandler; где в ExceptHandler и вызывалась данная ShowException(...)
осталось присвоить ExceptProc свой обработчик - и вуаля - мы получили перехват этого исключения :)


 
Альф   (2005-09-22 17:33) [17]

Т.е. как и ожидалось исключение возникает при попытке создать ActiveX контрол, класс котрого системе неизвестен.


 
Digitman ©   (2005-09-22 17:41) [18]

логично.

спасибо !

сабж сей я освежил у себя в памяти.



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

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

Наверх




Память: 0.51 MB
Время: 0.062 c
4-1124106668
Knop
2005-08-15 15:51
2005.10.16
Написать на Canvas


2-1126710094
Anfaenger
2005-09-14 19:01
2005.10.16
Function


14-1127366703
Starcom
2005-09-22 09:25
2005.10.16
Определение Noname Материнки?


1-1127600969
Леха
2005-09-25 02:29
2005.10.16
Таблица StringGrid


3-1125416074
Asail
2005-08-30 19:34
2005.10.16
Проблема с TQuery (удаление строк)