AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.02.2008, 17:11   #1  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Ax3 KR2 COM: Получение человеческих сообщений об ошибках
Я работаю с ADSI при помощи COM.

В некоторых случаях возникает ошибка:

Метод 'SetInfo' в COM-объекте класса '<неизвестно>' возвратил код ошибки 0x8007200A (<неизвестно>), который означает: <неизвестно>.

Если обработать ошибку вот таким образом:

X++:
void setInfo()
{
    COMError errorCom;
;
        try
        {
             object.SetInfo();
        }
        catch (Exception::Error)
        {
            errorCom = object.error();
            if (errorCom)
                throw error(strFmt("Ошибка %1 ('%2')",
                    errorCom.number(), WinApi::formatMessage(errorCom.number())));
            else
                throw Exception::Error;

        }
}

Ошибка становится человеческой:

Ошибка -2147016694 ('Указанное значение или атрибут службы каталогов не существует.')


Но при этом мы обязаны знать, какой объект зашибся.

Я пробовал обработать эту штуку глобально, но вместо errorCom.number() использовать WinApi::GetLastError, но оказалось, что она возвращает 0 всегда в таки случаях.

Как сделать так, чтобы
  • ошибки выглядели по человечески
  • не надо было бы писать обработку для всех объектов
За это сообщение автора поблагодарили: axaLearner (1).
Старый 07.03.2008, 13:16   #2  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Можно в Info.Add() редактировать добавляемую строку. Оттуда же брать код ошибки. Только придется анализировать стек вызова (искать \classes\com).
Криво, но хоть как-то работает.
Старый 07.03.2008, 16:08   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,698 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ну, я просто написал класс-обертку для обращений к COM. Соответственно, любое обращение в этом классе оборачивается в try...catch и я всегда знаю какой объект ошибся.

По аналогии со многими классами Axapta. Начиная от CCADO... и кончая ComOfficeDocument_RU.

В большинстве случаев, этого достаточно. А если все-таки возникает необходимость напрямую обращаться к методам COM-объекта, не через класс-обертку, то тут сам смотришь, оправдано ли try...catch или нет.
Старый 08.04.2008, 18:01   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,946 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Ну, я просто написал класс-обертку для обращений к COM. Соответственно, любое обращение в этом классе оборачивается в try...catch и я всегда знаю какой объект ошибся.
А можно поподробнее ?
Старый 09.04.2008, 12:28   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,698 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Logger Посмотреть сообщение
А можно поподробнее ?
Ни разу не разбирал класс ComOfficeDocument_RU ? С Excel или Word из Axapta не работал?

Идея заключается в том, что ты, конечно, можешь какждый раз в теле программы писать нечто вроде

X++:
COM  comObject;

comObject = new COM('MyCom');
comObject.method();
Однако можно создать класс в событии new которого создавать экземпляр нужного COM-объекта, а для обращения к методам этого Com-объекта создать дополнительные методы класса. Тогда тот же код будет выглядет примерно так:

X++:
MyClassForCom  myClassForCom;

myClassForCom = new MyClassForCom();
myClassForCom.method();
Получается, что к методам Com объекта обращаешся не "напрямую", а через "обертку". Собственный класс, внутри которого и делаются все нужные обращения к методам Com-объекта с дополнительным "отловом" возможных ошибок.
Старый 17.04.2008, 17:56   #6  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от belugin Посмотреть сообщение
Я работаю с ADSI при помощи COM.

В некоторых случаях возникает ошибка:

Метод 'SetInfo' в COM-объекте класса '<неизвестно>' возвратил код ошибки 0x8007200A (<неизвестно>), который означает: <неизвестно>.

Если обработать ошибку вот таким образом:
а как подавить вывод этого сообщения от ком-объекта? даже после перехвата в try-catch оно всё равно выводится.
__________________
Felix nihil admirari
Старый 17.04.2008, 18:56   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,946 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Ни разу не разбирал класс ComOfficeDocument_RU ? С Excel или Word из Axapta не работал?
Пшшш...
Спокуха !
Зачем так раздражаться ?

Работал с COM. Вопрос был связан с тем как обертку try Catch сделал. По идее если есть внешняя обертка - вложенный try Catch и транзакции то может и не сработать.

Интересно можно ли это обойти. Т.е. заставить гарантировано выдавать корректное сообщение об ошибке.
Старый 17.04.2008, 18:56   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,946 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от wojzeh Посмотреть сообщение
а как подавить вывод этого сообщения от ком-объекта? даже после перехвата в try-catch оно всё равно выводится.
Может быть удалять сообщение из Infolog в блоке Catch ?
Старый 18.04.2008, 11:46   #9  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,698 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Logger Посмотреть сообщение
Работал с COM. Вопрос был связан с тем как обертку try Catch сделал. По идее если есть внешняя обертка - вложенный try Catch и транзакции то может и не сработать.

Интересно можно ли это обойти. Т.е. заставить гарантировано выдавать корректное сообщение об ошибке.
М-да, внятно выражать свои мысли тоже надо уметь

Внешний Try...Catch - никак не мешает вложенному Try...Catch. Перехватывает ошибку всегда ближайший try...catch. Если надо "передать" исключение на предыдущий уровень, то просто после try..Catch генеришь исключение

throw error("Ошибка")

или возвращаешь "пустое" (ошибочное) значение, которое обрабатывается во внешнем методе.

А вот транзакция действительно мешает. Но тут ничего не поделаешь. Вне зависимости от того, кто именно сгенерил ошибку - COM или внутренний объект Axapta. При любом раскладе произойдет вылет в try...catch ближайший к началу транзакции самого верхнего уровня.
Старый 18.04.2008, 11:51   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,698 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от wojzeh Посмотреть сообщение
а как подавить вывод этого сообщения от ком-объекта? даже после перехвата в try-catch оно всё равно выводится.
Если дело дошло до этого, то только, как и советовал Logger остается очистка Infolog в блоке Catch.

Однако можно ведь и не доводить до сообщений об ошибках. Как правило, существует методы предварительной проверки: а сможет ли данный метод выполниться успешно? Если "Да", то запускаем метод, если "Нет", то запускать его не имеет смысла, поскольку он сгенерит исключение.

Ну, например, если в файле Excel нет 2-го листа, то попытка что-то ввести на второй лист сгенерит исключение. Но ведь можно заранее узнать у файла Excel сколько листов он имеет и при попытке обратится на заведомо не существующий лист выдавать предупреждение.
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
msdynamicsax: VB script that test the com connector for Dynamics Ax 4.0 Blog bot DAX Blogs 0 25.08.2008 18:05
Ax3 KR2: Создание пользователя в ActiveDirectory belugin DAX: Программирование 14 06.06.2007 13:44
Куда пропадают лицензии в Ax3.0 SP3 KR2? falcon65 DAX: Администрирование 2 10.05.2007 09:55
Проблема с получение коллекции (массива) из COM-объекта. VES DAX: Программирование 6 24.03.2006 18:59
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:09.