![]() |
![]() |
|
|
返されるステータスと例外の処理
X/OPEN RPC 仕様では、アプリケーション以外のエラーは状態パラメータまたは状態復帰で返されます。RPC サーバに障害があった場合には fault_status 値が返され、通信に障害があった場合には comm_status 値が返されます。状態復帰を指定するには、IDL ファイルでオペレーションの戻り値または error_status_t 型の [out] パラメータを定義します。さらにACF ファイルで、そのオペレーションまたはパラメータが [fault_status] または [comm_status] のいずれか、あるいは両方の属性を持つことを宣言します。
たとえば、IDL ファイル内で次のようにオペレーションを定義します。
error_status_t op([in,out]long *parm1, [out]error_status_t *commstat);
対応する ACF ファイル内での定義は次のようになります。
[fault_status]op([comm_status]commstat);
サーバからのエラーは、オペレーションの戻り値に、通信エラーは 2 番目のパラメータに返されます。クライアント・コードでは、以下のようにエラーを処理します。
if (op(&parm1, &commstat) != 0 || commstat != 0) /* エラーの処理 */
状態復帰を使用する利点は、エラー発生個所で対処が行え、きめ細かなエラー回復処理を実行できることです。
状態復帰の欠点は、ローカル版の関数には必要のないパラメータをリモート関数に付加することです。さらに、きめ細かなエラー回復処理は冗長になりがちで、エラーを引き起こす傾向があります (たとえば、場合分けに見落としが生じるなど)。
DCE は第 2 のメカニズムとして例外処理を定義しています。この例外処理は C++ のものと類似しています。
C や C++ のアプリケーション・コードを TRY、CATCH、CATCH_ALL、および ENDTRY ステートメントを用いて、例外が生じる可能性のあるブロックに区切ります。TRY はブロックの開始を示します。CATCH は、特定の例外用の処理ブロックを示します。CATCH_ALL は、対応する CATCH ステートメントを持たない例外を処理するために使われます。ENDTRY でブロックを終了します。例外処理が低いレベルでは行なえず、RERAISE ステートメントを用いて高いレベルのブロックで例外処理を行う場合、TRY ブロックはネストされます。例外処理ブロックの外部で例外が生じた場合は、プログラムはログにメッセージを記録して終了します。例外処理マクロの詳細と使用例については、『BEA Tuxedo C 言語リファレンス』の TRY(3c) を参照してください。
RPC コールに対して通信とサーバで生成される例外のほかに、さらに低いレベルの例外、特に、オペレーティング・システムのシグナルも生成されます。このような例外の詳細については、『BEA Tuxedo C 言語リファレンス』の TRY(3c) を参照してください。
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|