如何处理 CA/L 中的 XmlNode 错误

How to handle XmlNode error in CA/L

我使用 DotNet 函数从 XML 文件中读取 XmlNodes,但是有时我们会收到一个 XML 文件,该文件不包含某个节点的 DateTime 属性..

当我 运行 我的 CodeUnit 时,由于没有要读取的节点而出现错误,文件立即被丢弃在错误文件夹中 -> 有没有办法执行 Try / Catch或检查节点是否不为空/空?

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

上面的错误是在没有要读取的属性时出现的。我正在使用 Dynamics-Nav 2013 R2。

您可以选择多种选择。

首先,如果没有您搜索的节点,SelectSingleNode returns NULL。您所要做的就是在尝试调用 Value() 函数之前检查它是否存在 ISNULL:

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

您可能还想检查标准代码单元 6224 XML DOM 管理,其中包含用于 XML 解析的包装函数的数量。您可以使用 FindNodeXXX 函数而不是编写自己的代码。

如果你想在 Dynamics NAV 2013 R2 中实现 try..catch,方法是通过 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 运行 语句。