CORBAクライアント・アプリケーションの作成

     前  次    新規ウィンドウで目次を開く  新規ウィンドウで索引を開く  PDFとして表示 - 新規ウィンドウ  Adobe Readerを取得 - 新規ウィンドウ
コンテンツはここから始まります

例外処理

このトピックでは、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{

//Initialize the ORB
CORBA::ORB* orb=CORBA::ORB_init(argc, argv,
ORBid);

//Get a Bootstrap Object
Tobj_Bootstrap* bs= new Tobj_Bootstrap
(orb, “//host:port”);

//Resolve 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ユーザー例外がクラスの登録用のトランザクションのスコープ内でどのように機能するかを示します。

//Register a student for some course

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;
}

  先頭に戻る       前  次