Tuxedo CORBA クライアント アプリケーションの開発方法

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

例外処理

このトピックでは、CORBA C++ クライアント アプリケーションで CORBA 例外を処理する方法について説明します。

注意 : Oracle Tuxedo CORBA Java クライアントと Oracle Tuxedo CORBA Java クライアント ORB は Tuxedo 8.1 で非推奨になり、サポートされなくなりました。Oracle Tuxedo CORBA Java クライアントおよび Oracle Tuxedo CORBA Java クライアント ORB のテキスト参照、関連するコード サンプルはすべてサードパーティの Java ORB ライブラリの実装/実行の簡易化とプログラマによる参照だけに使用する必要があります。
注意 : サード パーティの CORBA Java ORB のテクニカル サポートは、各ベンダによって提供されます。Oracle Tuxedo では、サード パーティの CORBA Java ORB に関する技術的なサポートやマニュアルは提供していません。

 


CORBA 例外処理の概念

CORBA では、以下の例外が定義されています。

以降の節では、各タイプの CORBA クライアント アプリケーションがどのように例外を処理するかについて説明します。

 


CORBA システム例外

表 4-1 に、CORBA システム例外のリストを示します。

表 4-1 CORBA システム例外
例外名
説明
BAD_CONTEXT
コンテキスト オブジェクトの処理中にエラーが発生した。
BAD_INV_ORDER
ルーチン呼び出しが順不同。
BAD_OPERATION
無効なオペレーション。
BAD_PARAM
無効なパラメータが受け渡された。
BAD_TYPECODE
無効な typecode。
COMM_FAILURE
通信障害。
DATA_CONVERSION
データ変換エラー。
FREE_MEM
メモリを解放できない。
IMP_LIMIT
実装制限に違反した。
INITIALIZE
ORB 初期化障害。
INTERNAL
ORB 内部エラー。
INTF_REPOS
インタフェース リポジトリへのアクセス中にエラーが発生した。
INV_FLAG
無効なフラグが指定されている。
INV_IDENT
無効な識別子構文。
INV_OBJREF
無効なオブジェクト参照が指定されている。
MARSHAL
パラメータまたは結果のマーシャリング エラー。
NO_IMPLEMENT
オペレーションの実装が利用できない。
NO_MEMORY
動的メモリ割り当てが異常終了した。
NO_PERMISSION
試行されたオペレーションのパーミッションが存在しない。
NO_RESOURCES
要求を処理するためのリソースが不足している。
NO_RESPONSE
要求に対する応答がまだ利用できない。
OBJ_ADAPTER
オブジェクト アダプタによってエラーが検出された。
OBJECT_NOT_EXIST
オブジェクトが利用できない。
PERSIST_STORE
永続ストレージの障害。
TRANSIENT
一時障害。
UNKNOWN
未知の結果。

 


CORBA C++ クライアント アプリケーション

システム例外とユーザ例外のどちらも類似の機能を必要とするので、SystemException クラスと UserException クラスが共通の Exception クラスから派生されます。例外が発生すると、CORBA クライアント アプリケーションは Exception クラスから固有の SystemException クラスまたは UserException クラスにナロー変換することができます。図 4-1 に、C++ Exception の継承階層を示します。

図 4-1 C++ Exception の継承階層

C++ Exception の継承階層

Exception クラスは、以下のパブリック オペレーションを提供します。

copy constructor オペレーションと destructor オペレーションは、例外に関連付けられているストレージを自動的に管理します。

_narrow オペレーションを使用すると、CORBA クライアント アプリケーションは任意の型の例外を捕捉してその型を特定できます。_narrow オペレーションに渡される exception 引数は、基底クラスの Exception へのポインタです。_narrow オペレーションは、任意の Exception オブジェクトへのポインタを受け付けます。ポインタが SystemException 型である場合、narrow() オペレーションはその例外へのポインタを返します。ポインタが SystemException 型でない場合、narrow() オペレーションは Null ポインタを返します。

オブジェクト参照の _narrow オペレーションとは異なり、例外の _narrow オペレーションは新しい例外へのポインタではなく、同じ例外への適切に型付けされたポインタを返します。このため、_narrow オペレーションによって返されるポインタを開放してはなりません。元の例外がスコープをはずれるか破棄された場合、_narrow オペレーションによって返されるポインタは有効でなくなります。

注意 : Oracle Tuxedo CORBA サンプル アプリケーションでは、_narrow オペレーションは使用されていません。

システム例外の処理

Oracle Tuxedo サンプル アプリケーションの CORBA C++ クライアント アプリケーションは、エラー状態が発生した場合、ステータス値をチェックしてエラーを検出する代わりに、標準の C++ try-catch 例外処理メカニズムを使用して例外を発生および捕捉します。この例外処理メカニズムは、CORBA 例外を CORBA クライアント アプリケーションに統合するためにも使用されます。C++ では、catch 句が指定された順序で試行され、最初に一致したハンドラが呼び出されます。

次の Basic サンプル アプリケーションの CORBA C++ クライアント アプリケーションの例に、<< 演算子を使用した出力を示します。

注意 : このトピックでは、サンプル内の例外コードを太字で表します。
try{

// ORB を初期化
CORBA::ORB* orb=CORBA::ORB_init(argc, argv,
ORBid);

// Bootstrap オブジェクトを取得
Tobj_Bootstrap* bs= new Tobj_Bootstrap
(orb, “//host:port”);

// Factory Finder を解決
CORBA::Object_var var_factory_finder_oref = bs->
resolve_initial_reference(“FactoryFinder”);
Tobj::FactoryFinder_var var_factory_finder_ref = Tobj::FactoryFinder::_narrow
(var_factory_finder_oref.in());

catch(CORBA::Exception& e) {
cerr <<e.get_id() <<end1;
}

ユーザ例外

ユーザ例外は、それらが定義されているユーザ記述 OMG IDL ファイルから生成されます。例外を処理する場合、コードは最初にシステム例外をチェックする必要があります。システム例外は CORBA によってあらかじめ定義されており、多くの場合アプリケーションはシステム例外から回復できません。たとえば、システム例外はネットワーク転送の問題や ORB の内部的な問題を示す場合があります。システム例外のチェックが済んだら、特定のユーザ例外をチェックします。

次の C++ サンプルに、Registar インタフェース内部の TooManyCredits ユーザ例外を宣言する OMG IDL ファイルを示します。例外はモジュール内またはインタフェース内のいずれかで宣言できることに注意してください。

exception TooManyCredits
{
unsigned short maximum_credits;
};

interface Registrar

NotRegisteredList register_for_courses(
in StudentId student,
in CourseNumberList courses
) raises (
TooManyCredits
);

次の C++ のサンプル コードに、TooManyCredits ユーザ例外がクラスの登録用のトランザクションのスコープ内でどのように機能するかを示します。

// コースの学生を登録

try {
pointer_registrar_reference->register_for_courses
(student_id, course_number_list);

catch (UniversityT::TooManyCredits& e) {
cout <<"You cannot register for more than"<< e.maximum_credits
<<"credits."<<end1;
}

  ページの先頭       前  次