![]() ![]() ![]() ![]() ![]() ![]() ![]() |
このトピックでは、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
//Initialize the ORB
CORBA::ORB* orb=CORBA::ORB_init(argc, argv,);
(orb, “//host:port”);
//Get a Bootstrap Object
Tobj_Bootstrap* bs= new Tobj_Bootstrap
//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 coursetry {
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;}
![]() ![]() ![]() |