如何有效处理 Teamcenter ITK C++ 代码中的错误 [关闭]

Posted

技术标签:

【中文标题】如何有效处理 Teamcenter ITK C++ 代码中的错误 [关闭]【英文标题】:How to effectively handle errors in Teamcenter ITK C++ code [closed] 【发布时间】: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 块中传递给你,让你做任何你想做的事情。

简单吧?所以现在让我们删除所有这些宏并使用它……

【问题讨论】:

欢迎来到 ***!您似乎在尝试回答自己的问题 - 请采用本网站的问答格式,并将问题部分作为特定问题发布,将答案部分作为答案发布。 我试图在***中找到它。但我找不到它。然后我也找到了解决方案。那我怎么发呢? 请使用 ->edit 谢谢。 :) 我不知道这个。 对不起,由于某种原因,我没有看到现有的答案。如果您按照我说的做,但将“ResultCheck.hxx”内容合并到现有答案中而不是发布新答案,您可以将其变成一个体面的问题。 【参考方案1】:

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

【讨论】:

这里需要注意的一点是,使用 ResultCheck,每当它检测到除 ITK_ok 之外的任何内容时,它也会将该错误代码添加到错误堆栈数据结构的顶部。因此,您应该在退出该方法之前调用是否清除该数据结构。

以上是关于如何有效处理 Teamcenter ITK C++ 代码中的错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

simpleitk打开dicom文件

如何在 Python 中实现 itk 图像和 SimpleITK 图像之间的转换?

将使用 ITK 或 OpenCV 库的现有 C++ 项目转换为 DLL 是不是可能?

如何分发Teamcenter的jar文件?

ITK-Snap 处理医疗影像

ITK-Snap 处理医疗影像