2016-03-01 3 views
0

Я использовал функцию DotNet для чтения XmlNodes из XML-файла, однако иногда мы отправляем XML-файл, который не содержит атрибут DateTime для определенного узла.Как обрабатывать ошибку XmlNode в CA/L

Когда я запускаю свой CodeUnit, я получаю сообщение об ошибке из-за отсутствия узла для чтения, и файл моментально отбрасывается в папке «Ошибка» -> есть ли способ сделать попытку/уловку или проверить, нет ли узла empty/null?

XmlInBound.LocationDateType := xmlNode.SelectSingleNode('DateTime/@DateType').Value(); 

Вышеприведенные ошибки, когда нет атрибута для чтения. Я использую Dynamics-Nav 2013 R2.

ответ

3

Существует ряд вариантов, с которыми вы могли бы пойти.

Во-первых, если нет узлов, которые вы ищете, SelectSingleNode возвращает NULL. Все, что вам нужно сделать, это проверить его на ISNULL, прежде чем пытаться вызвать значение функции():

xmlSubNode := xmlNode.SelectSingleNode('DateTime/@DateType'); 
IF NOT ISNULL(xmlSubNode) THEN 
    XmlInBound.LocationDateType := xmlSubNode.Value(); 

Вы также можете изучить стандартный программный модуль 6224 XML DOM Management, который содержит ряд функций-оболочек для XML-анализа. Существуют функции FindNodeXXX, которые вы можете использовать вместо написания собственного кода.

Если вы хотите реализовать try..catch в Dynamics NAV 2013 R2, способ сделать это через конструкцию IF CODEUNIT.RUN THEN. Вам нужно будет создать новый программный модуль, который имеет все ошибки, возможно, код в OnRun триггера, передать необходимые ему параметры, а затем запустить его в IF заявление:

HandleCodeunit.SetParameters(xmlNode,...); 
IF HandleCodeunit.RUN THEN BEGIN 
    HandleCodeunit.GetResults(...); 
END ELSE BEGIN 
    // Handle error 
    MESSAGE(GETLASTERRORTEXT); 
    MESSAGE(GETLASTERRORCALLSTACK); 
    MESSAGE(FORMAT(GETLASTERROROBJECT)); 
END; 

Пожалуйста, обратите внимание, что вы не должны быть внутри транзакции записи, чтобы иметь возможность использовать оператор IF RUN.

+0

Привет, я наконец понял, что я был Уолли. Я относительно новичок в NAV, по сути, разработчик C#, поэтому я не делал переменную, которую я назначил узлу переменной DotNet, но обычную строку .. Таким образом, я продолжал получать Test: = ошибки DotNet .. Спасибо за ваш ответ :) – Daniel

Смежные вопросы