![]() |
#1 |
Участник
|
![]()
Как нужно описать в коде исключение для COM-объекта, чтобы Аксапта не генерировала сообщение об ошибке?
Объясню ситуацию: Есть две версии COM-объекта “Word.Application”. В одной версии, этого COMа, есть функция InsertRowsBelow, в другой, в место неё есть функция InsertRows. Необходимо сделать так, чтобы в случае неудачного вызова первой функции (InsertRowsBelow) вызывалась вторая (InsertRows). Вот как я пытался это сделать: try { selection.InsertRowsBelow(_num); // Здесь вываливается сообщение об ошибке } catch(exception::Error) { selection.InsertRows(_num); } |
|
![]() |
#2 |
Участник
|
Насколько известно, по-хорошему сделать это нельзя.
Есть способ типа "грязный хак": нарыть в MorphX класс Info и доработать его. Например, поправить метод viewBuild, там есть код <...> if (!browser.design().visible()) { browser.design().visible(true); <...> Написанное относится к 3.0 SP1 Rus |
|
![]() |
#3 |
Участник
|
Большое спасибо Beavis-analitik за ваш ответ.
Этот способ мне известен. Но в данной ситуации необходимо реализовать это исключение не меняя класса Info. Попробую что-нибудь придумать. |
|
![]() |
#4 |
Участник
|
Расскажите поподробнее, пожалуйста, об этом способе.
Цитата:
Есть способ типа "грязный хак": нарыть в MorphX класс Info и доработать его.
Хочу ещё поделиться проблемой при выгрузке в Excel Одна и та же выгрузка данных в Excel завершается успешно, условно говоря, два раза из трёх. Одна из типичных ошибок: "...Ошибка COM ...метод Value2() вызван с неверным количеством параметров". Выгрузка организована через "чистый" COM, а не класс ComExcelDocument_RU; вставка осуществляется построчно из массива (метод описан на форуме). Может, кто-то сталкивался с подобным непослушанием. |
|
![]() |
#5 |
Участник
|
Цитата:
Не понял, наверное, потому что не пользуюсь MorphX. В AOT'е класс Info не светится...
Имхо MorphX и AOT это одно и то же Developer's Guide: Цитата:
The development environment in Axapta is called MorphX.
|
|
![]() |
#6 |
Участник
|
У меня есть опыт работы с комом, правда в основном не в Аксапте. На сколько я понимаю такого быть не может. Я хотел бы глянуть код, если это возможно.
|
|
![]() |
#7 |
Участник
|
Попробуй внутри catch что-то типа
PHP код:
|
|
![]() |
#8 |
Участник
|
Дело втом, что сообщение об ошибке вываливается сразу после обращения к методу. До catch дело не дохдит.
|
|
![]() |
#9 |
Участник
|
Посмотри класс SysExcelTemplateWizard методы createWorkBook() или openWorkBook(). Там идет обработка ошибок при работе с Excel через COM.
|
|
![]() |
#10 |
Участник
|
Спасибо за совет, но я работаю с Word. И в класса которые там используются это сообщение не генерится. Может есть подобный класс для Word?
|
|
![]() |
#11 |
Участник
|
Может я чего-то не понимаю, но вроде бы логика простая. Пусть даже сообщение об ошибке вываливается до catch, но сразу после этого в catch оно удаляется из Infolog`а. И в принципе пользователь не должен ничего увидеть. Единственный, может у тебя catch не выполняется. Такое может быть, если твой код расположен внутри ttsbegin .. ttscommit.
|
|
![]() |
#12 |
Участник
|
try
{ selection.InsertRowsBelow(_num); // Здесь вываливается сообщение об ошибке } catch(exception::Error) { selection.InsertRows(_num); } После того как вываливается сообщение выполнение процедуры останавливается, нет ttsbegin и ttscommit. |
|
![]() |
#13 |
Участник
|
Цитата:
Изначально опубликовано bms
try { selection.InsertRowsBelow(_num); // Здесь вываливается сообщение об ошибке } catch(exception::Error) { selection.InsertRows(_num); } { infolog.clear(); selection.InsertRows(_num); } |
|
![]() |
#14 |
Участник
|
|
|
![]() |
#15 |
Участник
|
Господа CATCH ВООБЩЕ НЕ ВЫПОЛНЯЕТСЯ!!!
После selection.InsertRowsBelow(_num); выполнение процедуры прекращается. |
|
![]() |
#16 |
Участник
|
Возможножно возникает Exception не того типа, который вы обрабатываете (не Exception::Error). Попробуйте написать обработчики и для других типов исключений (Exception:
![]() |
|
![]() |
#17 |
Участник
|
Спасибо, но это первое что я сделал. Я перепробовал все типы Exception но результата так и не добился.
|
|
![]() |
#18 |
Участник
|
К сожалению ты прав. Ошибка отсутствия метода не перехватывается.
![]() |
|
![]() |
#19 |
Участник
|
Использовать Version() в данной ситуации не хотелось бы, но видно другого выхода нет.
Спасибо за помощь. |
|
![]() |
#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") |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|