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

Вниз

EOleException появляется, а программа продолжает выполнение   Найти похожие ветки 

 
И. Павел ©   (2011-02-09 12:05) [0]

Здравствуйте.

Долго ловил этого "неуловимого Джо", а теперь поймал, и не знаю, что с ним делать.
Моя программа использует API стороннего приложения.

Выполняется код:
v :=  <объект API>.<метод API>;
на этой строчке отладчик замирает, т.к. в <метод API> происходит таймаут. Потом я получаю сообщение отладчика:

"Progect <имя моего проекта> raised exception TOleException ... истекло время ожидания ..."

Но если после этого нажать на F8, то отладчик перейдет к следующей строке, и начнет выполнять ее. А EOleException даже пользователю не показывается. В итоге ошибка возникает совсем в другом месте, т.к. v, согласно документации к API - это строка, а возвращается null.

Подскажите, пожалуйста, можно ли перехватить эту ошибку? Она моя, или же возникает в стороннем COM-объекте или где-то между?

Заранее спасибо.


 
clickmaker ©   (2011-02-09 12:26) [1]

> согласно документации к API - это строка, а возвращается
> null

if not VarIsNull(v) ?


 
И. Павел ©   (2011-02-09 12:30) [2]

> clickmaker ©   (09.02.11 12:26)

Ну это ясно. А что если другая функция API может возвращаать и NULL? Ведь тогда вообще нельзя полагаться на результат, если API аозвращает NULL...


 
И. Павел ©   (2011-02-09 12:34) [3]

Подскажите, пожалуйста, правильно ли я понимаю, что произошло?

1. Мое приложение вызвало метод Com-объекта
2. Внутри метода Com-объекта возникло исключение TOleException и отладчик Delphi об этом как-то прознал
3. Исключение подавилось внутри Com, не обработавшись и не выйдя наружу.
4. Метод завершился успешно и вернул NULL, т.к. в переменную результата ничего не успело записаться (а успело бы на половине записаться - так и осталось бы...)

ИМХО все это выглядит довольно-таки фантастично, но другое объяснение мне в голову не приходит...


 
Dennis I. Komarov ©   (2011-02-09 12:40) [4]

ИМХО 3. - false


 
И. Павел ©   (2011-02-09 12:45) [5]

> ИМХО 3. - false

Похоже, что все-таки дело в интерфейсе. EOleException генерирует IDispach, когда вызванный метод COM объекта возвращает ошибку.
А кем потом подавляется это исключение - не понятно...


 
clickmaker ©   (2011-02-09 13:07) [6]

а у <объект API> нет случаем метода GetLastError или подобного?
возмножно, он сам и подавляет
except(e: EOleException)
Result := Null;


 
И. Павел ©   (2011-02-09 13:21) [7]

> а у <объект API> нет случаем метода GetLastError или подобного?

Есть, но при его вызове тоже возникает EOleException и возвращается NULL :)


 
Dennis I. Komarov ©   (2011-02-09 13:30) [8]


> clickmaker ©   (09.02.11 13:07) [6]

тогда откуда отладчик о нем знает?


 
clickmaker ©   (2011-02-09 14:07) [9]

> тогда откуда отладчик о нем знает?

исключения com транслируются в хост-экзе при отладке, но подавляются в рантайме


 
И. Павел ©   (2011-02-10 09:02) [10]

Моя проблема все еще актуальна...

Я попробовал создать тестовый COM-объект с методом, в котором происходит исключение и вызвал этот метод из своей программы. Сначала пришло сообщение об ошибке Exception (видимо, это сообщил сам COM-объект), потом сгенерировалась ошибке EOleException с текстом "...Разрушительный сбой...". Но эта ошибка вывелась наружу, так что я смог ее перехватить в своем блоке try/except.

Еще я попробовал заменить VarDispProc на функцию, просто генерирующую искллючение. ЭЭто исключение тоже выводится наружу. Значит, подавление исключения должно находиться где-то внутри Comobj.VarDispInvoke (именно эта функция привязывается к VarDispProc в блоке инициализации ComObj). Я нашел в функции VarDispProc месо, где генерируется TOleException, но так и не нашел, где это исключение подавляется...

Пожалуйста, подскажите, как можно отследжить эту ошибку? И главное - что это вообще за ошибка такая. Может ли она подавляться внутри COM (если бы сообщение об ошибки выводилось не только отладчиком, но и при работе с программой пользователя, я, наверное, так бы и решил, но ведь, как будто, ошибка генерируется внутри моей программы)...


 
И. Павел ©   (2011-02-10 09:13) [11]

Я поймал эту ошибку!!!
Я создал COM объект с методом:

try
 Exception.Create("");
except
end;


И, когда вызвал его из своей программы, отладчик сообщил мне о том, что сгенерировалась ошибка Exception! Как он вставил свой код в COM - я понятия не имею, но походе, что дельфийская библиотека ComObj НЕ ПОДАВЛЯЕТ ИСКЛЮЧЕНИЕ. Исключение подавляли авторы API! Видимо, COM объект в свою очередь вызывает другой COM-объект, генерирует EOleException и подавляет его!

PS: вот после таких вот багокопаний начинаешь задымываться - а не полезней ли для психики бросить программирования и устроиться менеджером - продавать спокойно холодильники (как большинство выпускников ВУЗов в том числе и компьютерных специальностей) и получать примерно такую же зарплату? :)


 
И. Павел ©   (2011-02-10 09:15) [12]

PS: извиняюсь за орфографию... Замучился  я с этой ошибкой, вот и не перепроверил.


 
Дмитрий Белькевич   (2011-02-10 12:59) [13]


> PS: вот после таких вот багокопаний начинаешь задымываться
> - а не полезней ли для психики бросить программирования
> и устроиться менеджером - продавать спокойно холодильники
> (как большинство выпускников ВУЗов в том числе и компьютерных
> специальностей) и получать примерно такую же зарплату? :
> )


Да, после некоторых багов, бывает, жалеешь - что в дворники не подался.
Особенно когда его приходится ловить месяцами (один такой буквально на днях словил), или годами.
Один баг у себя (с firebird"ом) - уже второй год ловлю. На форуме ibase только потешаются. На предложение платной консультации - говорят - полфурама занимается. Предложил деньги, удалённый доступ, доступ к сырцам - никто так и не ответил :(


 
RWolf ©   (2011-02-10 13:03) [14]


> try  
> Exception.Create("");
> except
> end;

raise Exception.Create(""); наверно всё таки.


 
Anatoly Podgoretsky ©   (2011-02-10 13:42) [15]

> Дмитрий Белькевич  (10.02.2011 12:59:13)  [13]

Так наверно деньги предлагал после решения, а надо было вперед.


 
И. Павел ©   (2011-02-10 13:49) [16]

> raise Exception.Create(""); наверно всё таки.

Да. Просто код не скопировал, а набрал заново.


 
Дмитрий Белькевич   (2011-02-10 14:40) [17]


> Так наверно деньги предлагал после решения, а надо было
> вперед.


Ага :)


 
Дмитрий Белькевич   (2011-02-10 15:02) [18]

Попробую еще здесь тему открыть, мало ли...



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

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

Наверх




Память: 0.51 MB
Время: 0.014 c
9-1189098446
Kav
2007-09-06 21:07
2011.05.22
glUseProgramObjectARB(0) ; жуткие тормоза


2-1297323108
student22
2011-02-10 10:31
2011.05.22
DLL


15-1297078540
Bat-an
2011-02-07 14:35
2011.05.22
Надо вызвать из батника две программы одновременно


1-1254725450
Aleks
2009-10-05 10:50
2011.05.22
Как вывести а потом стереть текст на канве Image?


15-1296821313
qazxsw
2011-02-04 15:08
2011.05.22
Доступ к видио карте