31.03.2004, 11:30 | #1 |
Участник
|
Обработка исключений COM-объектов
Как нужно описать в коде исключение для COM-объекта, чтобы Аксапта не генерировала сообщение об ошибке?
Объясню ситуацию: Есть две версии COM-объекта “Word.Application”. В одной версии, этого COMа, есть функция InsertRowsBelow, в другой, в место неё есть функция InsertRows. Необходимо сделать так, чтобы в случае неудачного вызова первой функции (InsertRowsBelow) вызывалась вторая (InsertRows). Вот как я пытался это сделать: try { selection.InsertRowsBelow(_num); // Здесь вываливается сообщение об ошибке } catch(exception::Error) { selection.InsertRows(_num); } |
|
31.03.2004, 12:05 | #2 |
Участник
|
Насколько известно, по-хорошему сделать это нельзя.
Есть способ типа "грязный хак": нарыть в MorphX класс Info и доработать его. Например, поправить метод viewBuild, там есть код <...> if (!browser.design().visible()) { browser.design().visible(true); <...> Написанное относится к 3.0 SP1 Rus |
|
31.03.2004, 12:21 | #3 |
Участник
|
Большое спасибо Beavis-analitik за ваш ответ.
Этот способ мне известен. Но в данной ситуации необходимо реализовать это исключение не меняя класса Info. Попробую что-нибудь придумать. |
|
31.03.2004, 16:03 | #4 |
Участник
|
Расскажите поподробнее, пожалуйста, об этом способе.
Цитата:
Есть способ типа "грязный хак": нарыть в MorphX класс Info и доработать его.
Хочу ещё поделиться проблемой при выгрузке в Excel Одна и та же выгрузка данных в Excel завершается успешно, условно говоря, два раза из трёх. Одна из типичных ошибок: "...Ошибка COM ...метод Value2() вызван с неверным количеством параметров". Выгрузка организована через "чистый" COM, а не класс ComExcelDocument_RU; вставка осуществляется построчно из массива (метод описан на форуме). Может, кто-то сталкивался с подобным непослушанием. |
|
31.03.2004, 16:29 | #5 |
Участник
|
Цитата:
Не понял, наверное, потому что не пользуюсь MorphX. В AOT'е класс Info не светится...
Имхо MorphX и AOT это одно и то же Developer's Guide: Цитата:
The development environment in Axapta is called MorphX.
|
|
31.03.2004, 17:02 | #6 |
Участник
|
У меня есть опыт работы с комом, правда в основном не в Аксапте. На сколько я понимаю такого быть не может. Я хотел бы глянуть код, если это возможно.
|
|
31.03.2004, 17:14 | #7 |
Участник
|
Попробуй внутри catch что-то типа
PHP код:
|
|
31.03.2004, 17:55 | #8 |
Участник
|
Дело втом, что сообщение об ошибке вываливается сразу после обращения к методу. До catch дело не дохдит.
|
|
31.03.2004, 18:34 | #9 |
Участник
|
Посмотри класс SysExcelTemplateWizard методы createWorkBook() или openWorkBook(). Там идет обработка ошибок при работе с Excel через COM.
|
|
31.03.2004, 18:43 | #10 |
Участник
|
Спасибо за совет, но я работаю с Word. И в класса которые там используются это сообщение не генерится. Может есть подобный класс для Word?
|
|
31.03.2004, 18:54 | #11 |
Участник
|
Может я чего-то не понимаю, но вроде бы логика простая. Пусть даже сообщение об ошибке вываливается до catch, но сразу после этого в catch оно удаляется из Infolog`а. И в принципе пользователь не должен ничего увидеть. Единственный, может у тебя catch не выполняется. Такое может быть, если твой код расположен внутри ttsbegin .. ttscommit.
|
|
01.04.2004, 10:29 | #12 |
Участник
|
try
{ selection.InsertRowsBelow(_num); // Здесь вываливается сообщение об ошибке } catch(exception::Error) { selection.InsertRows(_num); } После того как вываливается сообщение выполнение процедуры останавливается, нет ttsbegin и ttscommit. |
|
01.04.2004, 11:11 | #13 |
Участник
|
Цитата:
Изначально опубликовано bms
try { selection.InsertRowsBelow(_num); // Здесь вываливается сообщение об ошибке } catch(exception::Error) { selection.InsertRows(_num); } { infolog.clear(); selection.InsertRows(_num); } |
|
01.04.2004, 11:52 | #14 |
Участник
|
|
|
01.04.2004, 11:54 | #15 |
Участник
|
Господа CATCH ВООБЩЕ НЕ ВЫПОЛНЯЕТСЯ!!!
После selection.InsertRowsBelow(_num); выполнение процедуры прекращается. |
|
01.04.2004, 12:13 | #16 |
Участник
|
Возможножно возникает Exception не того типа, который вы обрабатываете (не Exception::Error). Попробуйте написать обработчики и для других типов исключений (Exception:eadlock и т.д. по списку). Не уверен, но может что и получится
|
|
01.04.2004, 12:21 | #17 |
Участник
|
Спасибо, но это первое что я сделал. Я перепробовал все типы Exception но результата так и не добился.
|
|
01.04.2004, 13:46 | #18 |
Участник
|
К сожалению ты прав. Ошибка отсутствия метода не перехватывается. А почему бы не воспользоваться методом version() объекта Application? И в зависмости от полученного значения вызывать тот или иной метод.
|
|
01.04.2004, 13:59 | #19 |
Участник
|
Использовать Version() в данной ситуации не хотелось бы, но видно другого выхода нет.
Спасибо за помощь. |
|
01.04.2004, 14:42 | #20 |
Роман Долгополов (RDOL)
|
Цитата:
Изначально опубликовано bms
Использовать Version() в данной ситуации не хотелось бы, но видно другого выхода нет. static void Job151(Args _args) { COM excel = new COM("Excel.Application"); try { new COMDispFunction(excel, "badfunction",COMDispContext::METHOD).call(); } catch (Exception::Internal) { info("Error found"); } } По уму следует создавать ту версию COM объекта, в которой присутсвует нужный метод , например new COM("Excel.Application.8") |
|