【发布时间】:2017-10-15 17:14:03
【问题描述】:
如何在 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 块中传递给你,让你做任何你想做的事情。
简单吧?所以现在让我们删除所有这些宏并使用它……
【问题讨论】:
-
欢迎来到 StackOverflow!您似乎在尝试回答自己的问题 - 请采用本网站的问答格式,并将问题部分作为特定问题发布,将答案部分作为答案发布。
-
我试图在stackoverflow中找到它。但我找不到它。然后我也找到了解决方案。那我怎么发呢?
-
请使用 ->edit
-
谢谢。 :) 我不知道这个。
-
对不起,由于某种原因,我没有看到现有的答案。如果您按照我说的做,但将“ResultCheck.hxx”内容合并到现有答案中而不是发布新答案,您可以将其变成一个体面的问题。
标签: c++ error-handling teamcenter teamcenter-itk