28.04.2020, 18:43 | #1 |
Участник
|
как перехватить "Объект 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 |
Участник
|
Эту ошибку не перехватить аксаптовким try/cath.
Но и просто присваивать объект CLR аксаптовской строке, надеясь на автоматическое приведение, просто не стоит, лучше прямо преобразовать. Например, в том же классе AifUtil в методе getClrErrorMessage хотя и знают, что там строка, но ей приводят при помощи CLRInterop::getAnyTypeForObject(...). Такие примеры раскинуты по многим местам AOT, так что Вам для корректности лучше вместо: X++: var = var_NET; X++: var = CLRInterop::getAnyTypeForObject(var_NET); |
|
28.04.2020, 19:14 | #3 |
Участник
|
|
|
28.04.2020, 20:05 | #4 |
Участник
|
Да просто проверить переменную на существования
X++: if (var_NET)
{
var = var_NET;
}
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
28.04.2020, 23:01 | #5 |
Боец
|
Цитата:
Сообщение от Raven Melancholic
Эту ошибку не перехватить аксаптовким try/cath.
Но и просто присваивать объект CLR аксаптовской строке, надеясь на автоматическое приведение, просто не стоит, лучше прямо преобразовать. Например, в том же классе AifUtil в методе getClrErrorMessage хотя и знают, что там строка, но ей приводят при помощи CLRInterop::getAnyTypeForObject(...). Такие примеры раскинуты по многим местам AOT, так что Вам для корректности лучше вместо: X++: var = var_NET; X++: var = CLRInterop::getAnyTypeForObject(var_NET); Цитата:
Цитата:
А вот так пойдёт. X++: if(!CLRInterop::isNull(var_NET)) { var = var_NET; // <-- генерируется вот тут } |
|
29.04.2020, 05:21 | #6 |
Участник
|
А от такого написания будет эффект? Поможет избежать каких либо еще ошибок?
Если в исходном коде так пишут.. X++: if (!CLRInterop::isNull(var_NET)) { var = CLRInterop::getAnyTypeForObject(var_NET); // если эта строка будет записана так } |
|
29.04.2020, 06:44 | #7 |
Участник
|
В 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 ''; }
__________________
Sergey Nefedov |
|
29.04.2020, 11:45 | #8 |
Участник
|
Заметил что в обоих случаях генерируется ошибка:
X++: var = CLRInterop::getAnyTypeForObject(var_NET); // тут var = var_NET; // тут |
|
29.04.2020, 19:35 | #9 |
Участник
|
А проверку на пустой объект делаете?
System.Environment::GetEnvironmentVariable может возвращать пустой объект, если переменная среды не задана. А нетовский null Аксапта не сможет преобразовать ни автоматом, ни вызовом приведения при помощи CLRInterop. Способ, проверки, предложенный DSPIC помогает? |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Объект не имеет метода "mandatory" | 4 | |||
Как программно "выделить" объект AOT? Или про глюки на открытии формы поиска | 4 | |||
"LIKE" и "OR" в "qbds" | 14 |
|