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++ の方法。ResultCheck
そして後で、OOTB (out-of-the-box) Teamcenterと呼ばれるものがあることさえ発見しました。
ヘッダー ファイルをインクルードし、そこからクラスを使用するだけです。
#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
}
すべての関数呼び出し return ステートメントで、 のインスタンスResultCheck
が作成されます。ヘッダー ファイルを確認すると、オーバーロードされた代入演算子がifail
(整数) を入力として受け取ることがわかります。ifail
内部的には、そうであるかどうかをチェックしますITK_ok
。そうでない場合は、単に をスローしIFail
ます。そして、やりたいことを何でもできるように、catch ブロックで制御が渡されます。
シンプルですね。それでは、これらのマクロをすべて削除して、これを使用しましょう…</p>