如何有效地处理Teamcenter ITK C++代码中的错误

How to effectively handle errors in Teamcenter ITK C++ code

本文关键字:代码 错误 C++ ITK 有效地 处理 Teamcenter      更新时间:2023-10-16

如何有效地处理 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++使用类和重载运算符的方式。后来我甚至发现在OOTB(开箱即用)Teamcenter中有一种叫做ResultCheck的东西。

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

#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 块中传递给您,以执行任何您想做的事情。

很简单不是吗?因此,现在让我们删除所有这些宏并使用它...

有类似的 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
}