![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
EOleException появляется, а программа продолжает выполнение
И. Павел © (2011-02-09 12:05:00)Здравствуйте.
Долго ловил этого "неуловимого Джо", а теперь поймал, и не знаю, что с ним делать.
Моя программа использует API стороннего приложения.
Выполняется код:
v := <объект API>.<метод API>;
на этой строчке отладчик замирает, т.к. в <метод API> происходит таймаут. Потом я получаю сообщение отладчика:
"Progect <имя моего проекта> raised exception TOleException ... истекло время ожидания ..."
Но если после этого нажать на F8, то отладчик перейдет к следующей строке, и начнет выполнять ее. А EOleException даже пользователю не показывается. В итоге ошибка возникает совсем в другом месте, т.к. v, согласно документации к API - это строка, а возвращается null.
Подскажите, пожалуйста, можно ли перехватить эту ошибку? Она моя, или же возникает в стороннем COM-объекте или где-то между?
Заранее спасибо.
Дмитрий Белькевич (2011-02-10 15:02:00) [1]Попробую еще здесь тему открыть, мало ли...
Дмитрий Белькевич (2011-02-10 14:40:00) [2]
> Так наверно деньги предлагал после решения, а надо было
> вперед.
Ага :)
И. Павел (2011-02-10 13:49:00) [3]> raise Exception.Create(''); наверно всё таки.
Да. Просто код не скопировал, а набрал заново.
Anatoly Podgoretsky (2011-02-10 13:42:00) [4]> Дмитрий Белькевич (10.02.2011 12:59:13) [13]
Так наверно деньги предлагал после решения, а надо было вперед.
RWolf (2011-02-10 13:03:00) [5]
> try
> Exception.Create('');
> except
> end;
raise Exception.Create('');наверно всё таки.
Дмитрий Белькевич (2011-02-10 12:59:00) [6]
> PS: вот после таких вот багокопаний начинаешь задымываться
> - а не полезней ли для психики бросить программирования
> и устроиться менеджером - продавать спокойно холодильники
> (как большинство выпускников ВУЗов в том числе и компьютерных
> специальностей) и получать примерно такую же зарплату? :
> )
Да, после некоторых багов, бывает, жалеешь - что в дворники не подался.
Особенно когда его приходится ловить месяцами (один такой буквально на днях словил), или годами.
Один баг у себя (с firebird'ом) - уже второй год ловлю. На форуме ibase только потешаются. На предложение платной консультации - говорят - полфурама занимается. Предложил деньги, удалённый доступ, доступ к сырцам - никто так и не ответил :(
И. Павел (2011-02-10 09:15:00) [7]PS: извиняюсь за орфографию... Замучился я с этой ошибкой, вот и не перепроверил.
И. Павел (2011-02-10 09:13:00) [8]Я поймал эту ошибку!!!
Я создал COM объект с методом:
try
Exception.Create('');
except
end;
И, когда вызвал его из своей программы, отладчик сообщил мне о том, что сгенерировалась ошибка Exception! Как он вставил свой код в COM - я понятия не имею, но походе, что дельфийская библиотека ComObj НЕ ПОДАВЛЯЕТ ИСКЛЮЧЕНИЕ. Исключение подавляли авторы API! Видимо, COM объект в свою очередь вызывает другой COM-объект, генерирует EOleException и подавляет его!
PS: вот после таких вот багокопаний начинаешь задымываться - а не полезней ли для психики бросить программирования и устроиться менеджером - продавать спокойно холодильники (как большинство выпускников ВУЗов в том числе и компьютерных специальностей) и получать примерно такую же зарплату? :)
И. Павел (2011-02-10 09:02:00) [9]Моя проблема все еще актуальна...
Я попробовал создать тестовый COM-объект с методом, в котором происходит исключение и вызвал этот метод из своей программы. Сначала пришло сообщение об ошибке Exception (видимо, это сообщил сам COM-объект), потом сгенерировалась ошибке EOleException с текстом "...Разрушительный сбой...". Но эта ошибка вывелась наружу, так что я смог ее перехватить в своем блоке try/except.
Еще я попробовал заменить VarDispProc на функцию, просто генерирующую искллючение. ЭЭто исключение тоже выводится наружу. Значит, подавление исключения должно находиться где-то внутри Comobj.VarDispInvoke (именно эта функция привязывается к VarDispProc в блоке инициализации ComObj). Я нашел в функции VarDispProc месо, где генерируется TOleException, но так и не нашел, где это исключение подавляется...
Пожалуйста, подскажите, как можно отследжить эту ошибку? И главное - что это вообще за ошибка такая. Может ли она подавляться внутри COM (если бы сообщение об ошибки выводилось не только отладчиком, но и при работе с программой пользователя, я, наверное, так бы и решил, но ведь, как будто, ошибка генерируется внутри моей программы)...
clickmaker (2011-02-09 14:07:00) [10]> тогда откуда отладчик о нем знает?
исключения com транслируются в хост-экзе при отладке, но подавляются в рантайме
Dennis I. Komarov (2011-02-09 13:30:00) [11]
> clickmaker © (09.02.11 13:07) [6]
тогда откуда отладчик о нем знает?
И. Павел (2011-02-09 13:21:00) [12]> а у <объект API> нет случаем метода GetLastError или подобного?
Есть, но при его вызове тоже возникает EOleException и возвращается NULL :)
clickmaker (2011-02-09 13:07:00) [13]а у <объект API> нет случаем метода GetLastError или подобного?
возмножно, он сам и подавляет
except(e: EOleException)
Result := Null;
И. Павел (2011-02-09 12:45:00) [14]> ИМХО 3. - false
Похоже, что все-таки дело в интерфейсе. EOleException генерирует IDispach, когда вызванный метод COM объекта возвращает ошибку.
А кем потом подавляется это исключение - не понятно...
Dennis I. Komarov (2011-02-09 12:40:00) [15]ИМХО 3. - false
И. Павел (2011-02-09 12:34:00) [16]Подскажите, пожалуйста, правильно ли я понимаю, что произошло?
1. Мое приложение вызвало метод Com-объекта
2. Внутри метода Com-объекта возникло исключение TOleException и отладчик Delphi об этом как-то прознал
3. Исключение подавилось внутри Com, не обработавшись и не выйдя наружу.
4. Метод завершился успешно и вернул NULL, т.к. в переменную результата ничего не успело записаться (а успело бы на половине записаться - так и осталось бы...)
ИМХО все это выглядит довольно-таки фантастично, но другое объяснение мне в голову не приходит...
И. Павел (2011-02-09 12:30:00) [17]> clickmaker © (09.02.11 12:26)
Ну это ясно. А что если другая функция API может возвращаать и NULL? Ведь тогда вообще нельзя полагаться на результат, если API аозвращает NULL...
clickmaker (2011-02-09 12:26:00) [18]> согласно документации к API - это строка, а возвращается
> null
if not VarIsNull(v) ?