Teamcenter |服务器|代码错误处理

时间:2017-05-16 14:40:32

标签: c++ error-handling

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

在编程语言中,函数通常返回整数值以表示成功/失败状态。零通常被视为成功,非零被视为失败。

在Teamcenter世界中,ITK /函数的返回值通常称为ifail。它预计为零(ITK_ok),如果没有,编码器应该做某事。例如错误处理,可用内存,打印消息等等。

现在我已经看到很多代码编写的人编写自定义甚至编写功能来检查返回状态,或者使用带有宏的赋值运算符。甚至当我第一次写我的第一个Teamcenter程序时,我写了这个。

#define ITK(A) {\
 iFail = A;\
 if (iFail != ITK_ok)\ {\
 DO SOMETHING\
 }\
}

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

ITK(AOM_ask_value_logical(myTag," attributeName",& attriubuteValue)); 它的作用是,将每个函数调用的输出与ITK_ok进行比较并做一些事情。它没有错。但是很多事情实际上可能出错,而且很难理解。

甚至我看到有人这样做

if( ITK_ok != AOM_ask_value_logical( myTag, "attributeName", &attriubuteValue) )
{
 // DO SOMETHING
}
int result = ITK_ok
result = AOM_ask_value_logical( myTag, "attributeName", &attriubuteValue);
if( ITK_ok != result )
{
 // DO SOMETHING
}
我的意思是,这个没有错。但它不会增加你的代码大小?难道你没有看到口是心非?

后来我意识到,我们可以用更优雅简单的方式做到这一点。使用类和重载运算符的C ++方式。后来我甚至发现在OOTB Teamcenter中有一个名为ResultCheck的东西。

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

#include <base_utils/ResultCheck.hxx>

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

它做得很小&amp;整洁的任务。有了这个,我之前的陈述将转换为下面的内容。

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

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

简单不是吗?所以我们现在删除所有这些宏并使用它......

1 个答案:

答案 0 :(得分:2)

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