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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.06.2014, 15:48   #1  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
:( AIF - как экранировать вызовы throw в аксапте
Из вне вызывается метод Аксапты при помощи AIF код выполняется, но внутри метода генерируется исключение throw error в конструкции try catch. На этом вызов метода из вне валиться и в catch выполнение кода не происходит.

Ax2009
пример

X++:
try
{
    this.postPurch(_purchId); //внутри этого метода возникает throw error....
}
catch
{
    //а это уже не выполняется ((
    this.sendMail();
    return 'Ошибка во время разноски заказа';
}
Нашел похожую тему AIF: как вернуть ошибки/инфолог из ахапты? сделал настройку как описано - возвращает текст последней ошибки, но catch все равно не выполняется. В идеале хотелось бы заэкранировать ошибку (чтобы метод не валился) и выполнить код в catch.

Последний раз редактировалось ex3em; 05.06.2014 в 15:59.
Старый 05.06.2014, 15:59   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Наверно, приведенный код выполняется внутри транзакции, иначе исключение ловилось бы в catch.
За это сообщение автора поблагодарили: ex3em (1).
Старый 05.06.2014, 16:19   #3  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
Очень на это похоже. Мой класс в Ах не содержит транзакций, а вот выше на системном уровне (откуда происходит сам вызов моего класса) скорее всего и стоит транзакция, но куда рыть не знаю. Т.е. не знаю цепочку системных вызовов которые идут до моего класса. Мой класс - потомок extends AifDocumentService.
Старый 05.06.2014, 17:04   #4  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от ex3em Посмотреть сообщение
Очень на это похоже. Мой класс в Ах не содержит транзакций, а вот выше на системном уровне (откуда происходит сам вызов моего класса) скорее всего и стоит транзакция, но куда рыть не знаю. Т.е. не знаю цепочку системных вызовов которые идут до моего класса. Мой класс - потомок extends AifDocumentService.
так поставьте точку остановки и посмотрите
Старый 09.06.2014, 15:08   #5  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
Не могу поставить точку остановки. Так как вызов AX метода происходит из php кода
Старый 06.04.2015, 12:39   #6  
ski is offline
ski
Участник
 
35 / 12 (1) ++
Регистрация: 27.05.2009
Можно написать костыль - в первых строках метода написать ttsCommit, а после заключительной обработки ttsBegin. Сделать еще дополнительные проверки в коде на уровень транзакции и т.д.
Старый 06.04.2015, 14:43   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от ex3em Посмотреть сообщение
Не могу поставить точку остановки. Так как вызов AX метода происходит из php кода
Стека вызова возвращает статический метод Xsession::xppCallStack(). Этот метод возвращает контейнер, где нечетые элементы - это полный путь доступа и имя выполняемого метода, а четные элементы - номер строки метода. Соответственно, вывести стек вызова в инфолог можно так

X++:
    Container   conValue;
    int         i;
    ;

    conValue = Xsession::xppCallStack();

    for (i = 1; i <= conLen(conValue); i+=2)
    {
        info(strFmt('%1 (строка = %2)',conPeek(conValue,i), int2str(conPeek(conValue,i+1)));
    }
Для целей отладки вставьте этот код сразу за ключевым словом try. Получите информацию о стеке вызова и далее можете разбираться где была установлена транзакция
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Logger (1).
Старый 06.04.2015, 15:12   #8  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Посмотрите на статью на StackOverflow, нам помогла решить похожую проблему год назад:Can't catch exception inside AIF service
Цитата:
AIF has one big transaction somewhere deep in the core code and an own try catch.

So when you throw an error inside AIF sevice it is going to abort the outer transaction and go to staight to the AIF catch clause, skipping all others.

That's why I couldn't catch it. Solution could be to commit AIF transaction, run your code and before return begin new transaction.
Реализовано было примерно так:
Цитата:
//перед запуском операции закрывались все транзакциии
ttsLevel = appl.ttsLevel();

for (i = 1; i <= ttsLevel; i++)
{
ttsCommit;
}

//-->>...
//здесь вызывалась бизнес-логика (у нас запускался сервис Аксапты)
//--<<

//после выполнения операции транзакции заново открывались
for (i = 1; i <= ttsLevel; i++)
{
ttsBegin;
}
Старый 04.08.2016, 15:09   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Интересно, а зачем AIF-у одна большая транзакция на все.
Какой в этом смысл ?
Ведь штатно невозможно нормально пользоваться обработкой исключений.
Кто-нибудь встречал пояснения от поставщика решения ?
Старый 04.08.2016, 17:05   #10  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от Logger Посмотреть сообщение
Интересно, а зачем AIF-у одна большая транзакция на все.
Какой в этом смысл ?
Ведь штатно невозможно нормально пользоваться обработкой исключений.
Кто-нибудь встречал пояснения от поставщика решения ?
А на все - это на что? Импорт одного файла, вызов одной WCF функции - логично их держать per transaction для целостности данных.
Другое дело, что AX не умеет ловить вложенные try\catch...
Старый 04.08.2016, 17:13   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от DSPIC Посмотреть сообщение
А на все - это на что? Импорт одного файла, вызов одной WCF функции - логично их держать per transaction для целостности данных.
Логично ?
Ни разу.

Почему бы не предоставить самому обработчику решать - нужна ему единая транзакция или нет ?
Старый 04.08.2016, 18:44   #12  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от Logger Посмотреть сообщение
Почему бы не предоставить самому обработчику решать - нужна ему единая транзакция или нет ?
А в каких случаях она не нужна ?
__________________
-ТСЯ или -ТЬСЯ ?
Старый 04.08.2016, 19:07   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Vadik Посмотреть сообщение
А в каких случаях она не нужна ?
В наших

Например, большие обработки из кучи записей. Случаи когда высока вероятность исключения и.т.п.
Да мало ли.

А у вас есть обоснование зачем транзакцию начинать до старта обработчика, лишая нас возможности обрабатывать исключения ? Если нам понадобится, то внутри мы ее и сами откроем. А зачем нас лишили обработки исключений ?

P.S.
Я вообще не против транзакций, я хочу сам рулить - когда их начинать и завершать. И хочу чтобы нормально ловились исключения. А не жульническими методами как выше описано.

Последний раз редактировалось Logger; 04.08.2016 в 19:15.
Теги
aif, транзакции

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
kamalblogs: AIF: Testing Document services surpassing the AIF setup – Dynamics AX 2012 Blog bot DAX Blogs 0 05.11.2013 21:11
AIF: Microsoft Dynamics AX Services and Windows Azure Service Bus Blog bot DAX Blogs 0 24.07.2013 03:13
AIF: How to serialize int/real properties with 0/0.00 values via AIF outbound integration Blog bot DAX Blogs 0 08.05.2012 04:13
daxdilip: How to: Configure Dynamics AX AIF Services to listen for SSL Requests (https) Blog bot DAX Blogs 0 23.01.2011 10:12
Dianne Siebold: AIF Top Ten Blog bot DAX Blogs 1 22.04.2008 11:19

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

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

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