Форум: "Начинающим";
Текущий архив: 2011.05.22;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.003 c