|
このトピックでは、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 クライアント アプリケーションがどのように例外を処理するかについて説明します。
表 4-1 に、CORBA システム例外のリストを示します。
システム例外とユーザ例外のどちらも類似の機能を必要とするので、SystemException クラスと UserException クラスが共通の Exception クラスから派生されます。例外が発生すると、CORBA クライアント アプリケーションは Exception クラスから固有の SystemException クラスまたは UserException クラスにナロー変換することができます。図 4-1 に、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{ORBid
// ORB を初期化
CORBA::ORB* orb=CORBA::ORB_init(argc, argv,);(orb, “//host:port”);
// Bootstrap オブジェクトを取得
Tobj_Bootstrap* bs= new Tobj_Bootstrap
// 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;}
|