![]() |
![]() |
![]() |
![]() |
![]() |
表4-1に、CORBAシステム例外のリストを示します。
表4-1 CORBAシステム例外 システム例外とユーザー例外の両方が類似の機能を必要とするため、SystemExceptionクラスとUserExceptionクラスは共通のExceptionクラスから派生します。例外が発生すると、CORBAクライアント・アプリケーションはExceptionクラスから固有のSystemExceptionクラスまたはUserExceptionクラスにナロー変換することができます。図4-1に、C++ Exceptionの継承階層を示します。図4-1 C++ Exceptionの継承階層
• _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句が指定された順序で試行され、最初に一致したハンドラが呼び出されます。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;
}次の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;
}