-9

如何有效处理 Teamcenter 服务器自定义代码中的 ITK 调用引发的错误?

在 C ITK API 中,函数通常返回一个整数值来表示成功/失败。零 ( ITK_ok) 通常被视为成功,非零则被视为失败。如果发生故障,开发人员必须清理使用的资源(例如,空闲内存)。

我见过很多定制开发人员使用宏编写的代码。甚至当我第一次编写我的第一个 Teamcenter ITK 程序时,我也是这样做的:

#define ITK(A) { \
    iFail = A; \
    if (iFail != ITK_ok) { \
        HANDLE THE ERROR \
    } \
}

我定义了一个这样的宏,并在我进行 ITK 函数调用的任何地方使用它。例如:

ITK(AOM_ask_value_logical(myTag, "attributeName", &attributeValue));

它比较每个函数调用的输出ITK_ok并做一些事情。没有什么问题。但是很多事情实际上可能会出错,而且很难理解。

我什至见过有人这样做:

if (ITK_ok != AOM_ask_value_logical(myTag, "attributeName", &attributeValue))
{
    // DO SOMETHING
}

或者

int result = ITK_ok
result = AOM_ask_value_logical( myTag, "attributeName", &attributeValue);
if (ITK_ok != result)
{
    // DO SOMETHING
}

我的意思是,这个没有任何问题。但它不会增加你的代码大小吗?你没看到两面性吗?

后来,我意识到我们可以用更优雅简单的方式来做到这一点。使用类和重载运算符的 C++ 方式。ResultCheck后来我什至发现在 OOTB(开箱即用)Teamcenter 中有一种叫做 as 的东西。

您需要做的就是包含一个头文件并使用其中的一个类。

#include <base_utils/ResultCheck.hxx>

该文件ResultCheck使用重载赋值运算符声明类。该文件包含在 Teamcenter 工具包中,您可以查看一下。

它做了一个非常小而整洁的任务。有了这个,我之前的陈述被转换为下面的陈述。

ResultCheck rCheck = ITK_ok;
try
{
    rCheck = AOM_ask_value_logical( myTag, "attributeName", &attributeValue);
}
catch (const IFail &ex)
{
    // DO SOMETHING
}

对于每个函数调用返回语句,ResultCheck都会创建一个实例。如果您检查头文件,您会看到重载的赋值运算符将ifail(整数)作为输入。它在内部检查是否ifail存在ITK_ok。如果不是,那么它只是抛出IFail. 并且控制权在 catch 块中传递给您以执行您想做的任何事情。

是不是很简单?所以现在让我们删除所有这些宏并使用它……</p>

4

1 回答 1

3

有类似的 ResultStatus 类可以做同样的事情。

#include <base_utils/TcResultStatus.hxx>

示例代码就像

ResultStatus rStatus = ITK_ok;
try
{
     rStatus = AOM_ask_value_logical( myTag, "attributeName", &attriubuteValue);
}
catch(const IFail &ex)
{
     // DO SOMETHING
}
于 2017-05-16T14:44:27.783 回答