如何有效处理 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>