Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1297096029
Женя
2011-02-07 19:27
2011.05.22
Распознание символов


6-1236800865
Дмитрий Белькевич
2009-03-11 22:47
2011.05.22
Не меняется порт в TIdSyslogServer (или скорее TIdUDPServer)


15-1296566174
oxffff
2011-02-01 16:16
2011.05.22
Есть интересная задача


2-1297684583
Den
2011-02-14 14:56
2011.05.22
Уменьшить размер памяти занимаемой приложением


2-1297232556
SKIPtr
2011-02-09 09:22
2011.05.22
переключение между TEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский