2017-05-16 179 views
-8

如何有效處理Teamcenter服務器定製中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工具包中,您可以查看一下。

它做了一個非常小的&整潔的任務。與此,我的早先的聲明轉換爲下面。

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塊做你想做的任何事情。

簡單是不是?所以現在讓我們刪除所有這些宏,並使用它...

+3

歡迎的StackOverflow!它看起來像你試圖回答你自己的問題 - 請採用本網站的問答形式,並將問題部分作爲具體問題和答案部分作爲答案。 – Filburt

+0

我試圖在stackoverflow中找到它。但我找不到它。然後我找到解決方案。那我該如何發佈呢? – gabehcuod

+3

請使用 - > [編輯] < - 鏈接更新您的問題 - 不要將更新或其他信息作爲單獨的答案發布。本網站不適合您習慣的方式。 – Filburt

回答

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 
}