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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.05.2013, 16:47   #1  
AR® is offline
AR®
Участник
 
30 / 15 (1) ++
Регистрация: 07.09.2012
DAX2009, try / catch не перехватывает исключение (не в транзакции)
Собственно, код:
X++:
        try
        {
            c = new DictClass(className2Id(ClassName)).makeObject(params);
        }
        catch(Exception::Error)
        {
            error(strfmt("Не удалось создать экземпляр класса %1", ClassName));
        }
В catch() пробовал написать разные Exception или вообще не писать ничего - не помогло.
Суть в том, что надо отловить случай передачи несуществующего ClassName или неправильного количества / типов параметров в makeObject().
Не ловит
Старый 22.05.2013, 17:26   #2  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Потому что некоторые типы runtime-ошибок отловить нельзя. Никак. Например, ваш случай, когда вместо объекта передается null, а потом вызывается его метод, или если вызвать неоткомпилированный метод и прочие подобные случаи. Выход - проверять корректность самостоятельно.
__________________
С уважением,
Олег.
Старый 22.05.2013, 18:54   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от AR® Посмотреть сообщение
Суть в том, что надо отловить случай передачи несуществующего ClassName
Для этого достаточно проверять, что DictClass создался, т.е. завести промежуточную переменную типа DictClass и проверять, что она не равна null после присваивания.
Цитата:
Сообщение от AR® Посмотреть сообщение
или неправильного количества / типов параметров в makeObject()
У... это вы, по-моему, заигрались с обобщенным кодом. Используйте более строгую типизацию, "контракты данных", как в 2012-й, тогда и проверять будет проще. Кроме того, что в вашем примере - params, контейнер что ли? С точки зрения makeObject() контейнер params - это один параметр, так что если надо передавать несколько параметров, то это надо делать явно, указывая их в коде через запятую в вызове makeObject(). Поэтому непонятно, как вы подобным кодом собрались контролировать неправильное количество параметров.
Старый 23.05.2013, 10:25   #4  
AR® is offline
AR®
Участник
 
30 / 15 (1) ++
Регистрация: 07.09.2012
Цитата:
Сообщение от oip
Потому что некоторые типы runtime-ошибок отловить нельзя. Никак.
Плохо

Цитата:
Сообщение от gl00mie
У... это вы, по-моему, заигрались с обобщенным кодом.
По-другому никак. Имя класса для конкретного случая выполнения кода берется из справочника.

Всех благодарю.
Старый 23.05.2013, 15:29   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Я как-то видел реализации, где в настроечные данные прописывался, кроме прочего, идентификатор класса-обработчика. По-моему, вытаскивать в настройки "внутренности" реализации того или иного функционала - это очень пагубный подход. Во-первых, откуда тот, кто выполняет настройку, должен знать название/идентификатор класса-обработчика? Во-вторых, откуда он знает, что со временем что-то не поменяется, и не будет использоваться другой класс-обработчик? Кто в таком случае обновит настроечные данные? В общем, это хорошо для пакетных заданий, потому что там инфраструктура заранее не знает, какой именно наследник RunBaseBatch будет использоваться, и наследников этих может быть сколь угодно много, а для других случаев это опять-таки, по-моему, - очень пагубный подход.

Есть стандартный подход для таких ситуаций: заводится енум с перечислением различных разновидностей чего-нибудь, и делается статический метод, который по значению енума создает и возвращает экземпляр нужного класса-обработчика. Плюсы такого подхода:
  • отвязывание настроек от реализации;
  • повышение гибкости реализации (сегодня несколько значений енума могут обрабатываться одним классом, завтра - несколькими, по классу на значение);
  • возможность использования строгой типизации с контролем на этапе компиляции (метод-конструктор возвращает не абы что, а предположительно наследника определенного базового класса либо класс, реализующий заранее известный интерфейс).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ax-erp: Try Catch and transactions Blog bot DAX Blogs 0 29.10.2012 19:11
fatihdemirci: Try ve Catch Komutları Blog bot DAX Blogs 0 05.10.2010 22:05
try/catch Varmen DAX: Программирование 2 25.11.2009 17:47
try...catch при операциях с таблицей ushastik DAX: Программирование 1 09.03.2004 18:26
Глупый вопрос про try .. catch Vadik DAX: База знаний и проекты 6 12.03.2003 18:04

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:31.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.