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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.04.2020, 18:43   #1  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
как перехватить "Объект CLR не может быть упакован..."
Привет всем.
Подскажите как перехватить ошибку:
Объект CLR не может быть упакован в любой тип Microsoft Dynamics.

Пытаюсь перехватить в методе случай когда у переменная окружения не задана:

X++:
static str getEnvironmentVar(str _env)
{
    System.String var_NET;
    str env, var;
    ;

    env = strReplace(_env, '%', '');
    try
    {
        var_NET = System.Environment::GetEnvironmentVariable(env);
        var = var_NET; // <-- генерируется вот тут
    }
    catch (Exception::Error)
    {
        error(strFmt('Environment variable %1 is not set', env));
        return '';
    }

    return var;
}

Последний раз редактировалось oleggy; 28.04.2020 в 18:45.
Старый 28.04.2020, 18:58   #2  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Эту ошибку не перехватить аксаптовким try/cath.
Но и просто присваивать объект CLR аксаптовской строке, надеясь на автоматическое приведение, просто не стоит, лучше прямо преобразовать.
Например, в том же классе AifUtil в методе getClrErrorMessage хотя и знают, что там строка, но ей приводят при помощи CLRInterop::getAnyTypeForObject(...). Такие примеры раскинуты по многим местам AOT, так что Вам для корректности лучше вместо:
X++:
var = var_NET;
прописать:
X++:
var = CLRInterop::getAnyTypeForObject(var_NET);
Хотя я бы еще сначала проверил на пустое значение NET переменную.
Старый 28.04.2020, 19:14   #3  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Хотя я бы еще сначала проверил на пустое значение NET переменную.
Можете подсказать каким методом?
Старый 28.04.2020, 20:05   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Да просто проверить переменную на существования

X++:
if (var_NET)
{
    var = var_NET;
}
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 28.04.2020, 23:01   #5  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Эту ошибку не перехватить аксаптовким try/cath.
Но и просто присваивать объект CLR аксаптовской строке, надеясь на автоматическое приведение, просто не стоит, лучше прямо преобразовать.
Например, в том же классе AifUtil в методе getClrErrorMessage хотя и знают, что там строка, но ей приводят при помощи CLRInterop::getAnyTypeForObject(...). Такие примеры раскинуты по многим местам AOT, так что Вам для корректности лучше вместо:
X++:
var = var_NET;
прописать:
X++:
var = CLRInterop::getAnyTypeForObject(var_NET);
Так не пойдёт.

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Да просто проверить переменную на существования

X++:
if (var_NET)
{
    var = var_NET;
}
Так тоже не пойдёт.

Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Хотя я бы еще сначала проверил на пустое значение NET переменную.

А вот так пойдёт.
X++:
if(!CLRInterop::isNull(var_NET))
{
       var = var_NET; // <-- генерируется вот тут
}
Старый 29.04.2020, 05:21   #6  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
А от такого написания будет эффект? Поможет избежать каких либо еще ошибок?
Если в исходном коде так пишут..
X++:
if (!CLRInterop::isNull(var_NET))
{
       var = CLRInterop::getAnyTypeForObject(var_NET); // если эта строка будет записана так
}
Старый 29.04.2020, 06:44   #7  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
В AX 2012 исключение var = var_NET; при условии что var_NET = null можно перехватить кодом ниже, можно просто пустой catch использовать, тоже перехватит.

X++:
    catch(Exception::CLRError)
    {
        error(strFmt('Environment variable %1 is not set or other CLR error', env));
        return '';
    }
или

X++:
    catch
    {
        error(strFmt('Environment variable %1 is not set or other error', env));
        return '';
    }
Если же var_NET - это именно System.String и не null, то можно просто var = var_net.
__________________
Sergey Nefedov
Старый 29.04.2020, 11:45   #8  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Заметил что в обоих случаях генерируется ошибка:
X++:
var = CLRInterop::getAnyTypeForObject(var_NET); // тут
var = var_NET; // тут
Так в чем смысл getAnyTypeForObject для NET объектов? Может он не помогает?
Старый 29.04.2020, 19:35   #9  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
А проверку на пустой объект делаете?
System.Environment::GetEnvironmentVariable может возвращать пустой объект, если переменная среды не задана. А нетовский null Аксапта не сможет преобразовать ни автоматом, ни вызовом приведения при помощи CLRInterop.
Способ, проверки, предложенный DSPIC помогает?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Объект не имеет метода "mandatory" arhat DAX: Программирование 4 12.01.2016 14:32
Как программно "выделить" объект AOT? Или про глюки на открытии формы поиска gl00mie DAX: Программирование 4 15.02.2012 18:20
"LIKE" и "OR" в "qbds" @x DAX: Программирование 14 20.01.2004 13:20
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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