目次 前 次 PDF


例外処理

例外処理
このトピックでは、CORBA C++クライアント・アプリケーションでCORBA例外を処理する方法について説明します。
注意:
サード・パーティのCORBA Java ORBのテクニカル・サポートは、各ベンダーによって提供されます。Oracle Tuxedoでは、サード・パーティのCORBA Java ORBに関する技術的なサポートやマニュアルは提供していません。
CORBA例外処理の概念
CORBAでは、以下の例外が定義されています。
以降の項では、各タイプのCORBAクライアント・アプリケーションがどのように例外を処理するかについて説明します。
CORBAシステム例外
表4-1に、CORBAシステム例外のリストを示します。
 
CORBA C++クライアント・アプリケーション
システム例外とユーザー例外の両方が類似の機能を必要とするため、SystemExceptionクラスとUserExceptionクラスは共通のExceptionクラスから派生します。例外が発生すると、CORBAクライアント・アプリケーションはExceptionクラスから固有のSystemExceptionクラスまたはUserExceptionクラスにナロー変換することができます。図4-1に、C++ Exceptionの継承階層を示します。
図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{

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

Copyright ©1994, 2017,Oracle and/or its affiliates. All rights reserved