|
|
例外処理
このトピックでは、CORBA C++、CORBA Java、および ActiveX クライアント・アプリケーションで CORBA 例外を処理する方法について説明します。
CORBA 例外処理の概念
CORBA では、以下の例外が定義されています。
以降の節では、各タイプの CORBA クライアント・アプリケーションがどのように例外を処理するかについて説明します。
CORBA システム例外
表 5-1 に、CORBA システム例外のリストを示します。
CORBA C++ クライアント・アプリケーション
システム例外とユーザ例外のどちらも類似の機能を必要とするので、SystemException
クラスと UserException
クラスが共通の Exception
クラスから派生されます。例外が発生すると、CORBA クライアント・アプリケーションは Exception
クラスから固有の SystemException
クラスまたは UserException
クラスにナロー変換することができます。図 5-1 に、C++ Exception の継承階層を示します。
図5-1 C++ Exception の継承階層
Exception
クラスは、以下のパブリック・オペレーションを提供します。
copy constructor
destructor
_narrow
copy constructor
オペレーションと destructor
オペレーションは、例外に関連付けられているストレージを自動的に管理します。
_narrow
オペレーションを使用すると、CORBA クライアント・アプリケーションは任意の型の例外をキャッチしてその型を特定できます。_narrow
オペレーションに渡される exception
引数は、基底クラスの Exception
へのポインタです。_narrow
オペレーションは、任意の Exception オブジェクトへのポインタを受け付けます。ポインタが SystemException
型である場合、narrow()
オペレーションはその例外へのポインタを返します。ポインタが SystemException
型でない場合、narrow()
オペレーションは Null
ポインタを返します。
オブジェクト・リファレンスの _narrow
オペレーションとは異なり、例外の _narrow
オペレーションは新しい例外へのポインタではなく、同じ例外への適切に型付けされたポインタを返します。このため、_narrow
オペレーションによって返されるポインタを開放してはなりません。元の例外がスコープをはずれるか破棄された場合、_narrow
オペレーションによって返されるポインタは有効でなくなります。
注記 BEA Tuxedo CORBA サンプル・アプリケーションでは、_narrow
オペレーションは使用されていません。
システム例外の処理
BEA Tuxedo サンプル・アプリケーションの CORBA C++ クライアント・アプリケーションは、エラー状態が発生した場合、ステータス値をチェックしてエラーを検出する代わりに、標準の C++ try-catch 例外処理メカニズムを使用して例外を発生およびキャッチします。この例外処理メカニズムは、CORBA 例外を CORBA クライアント・アプリケーションに統合するためにも使用されます。C++ では、catch
句が指定された順序で試行され、最初に一致したハンドラが呼び出されます。
次の Basic サンプル・アプリケーションの CORBA C++ クライアント・アプリケーションの例に、<< 演算子を使用した出力を示します。
注記 このトピックでは、サンプル内の例外コードを太字で表します。
try{
//ORB を初期化
CORBA::ORB* orb=CORBA::ORB_init(argc, argv,ORBid
);
(orb, "//
//Bootstrap オブジェクトを取得
Tobj_Bootstrap* bs= new Tobj_Bootstraphost:port
");
// 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;}
CORBA Java クライアント・アプリケーション
注記 このセクションの情報は、「OMG IDL/Java Language Mapping Specification, orbos/97-03-01」(1997 年 3 月 19 日改訂) をベースにしています。
CORBA Java クライアント・アプリケーションは、CORBA C++ クライアント・アプリケーションと同じような方法で例外を処理します。
java.lang.RuntimeException
から継承されます。java.lang.Exception
から継承されます。図 5-2 に、Java Exception クラスの継承階層を示します。
図5-2 Java Exception 継承階層
システム例外
標準の OMG IDL システム例外は、org.omg.CORBA.SystemException
を拡張し、OMG IDL の大小の例外コード、および例外の理由を定義した文字列へのアクセスを提供する最終的な Java クラスにマップされます。
注記 org.omg.CORBA.SystemException
のパブリック・コンストラクタは存在せず、その拡張クラスだけをインスタンス化できます。
各標準 OMG IDL 例外の Java クラス名はその OMG IDL 名と同じで、org.omg.CORBA
パッケージで宣言されます。たとえば、CORBA 定義のシステム例外 BAD_CONTEXT
は、org.omg.CORBA.BAD_CONTEXT
としてマップされます。デフォルト・コンストラクタは、小さいコードの場合は 0、完了コードの場合は COMPLETED_NO
、および理由の文字列の場合は ""
を提供します。また、理由を取り、ほかのフィールドのデフォルトを使用するコンストラクタ、および 3 つのパラメータをすべて指定する必要があるコンストラクタが存在します。
次の Java コード例に、システム例外の使い方を示します。
try
// Factory Finder を解決
{
org.omg.CORBA.Object off = bs.resolve_initial_references
("FactoryFinder");
FactoryFinder ff=FactoryFinderHelper.narrow(off);
org.omg.CORBA.Object of = FactoryFinder.find_one_factory_by_id
(UniversityT.RegistrarFactoryHelper.id());
UniversityT.RegistrarFactory F =
UniversityT.RegistrarFactoryHelper.narrow(of);
catch (org.omg.CORBA.SystemException e)
{
System.err.println("System exception " + e);
System.exit(1);}
ユーザ例外
ユーザ例外は org.omg.CORBA.UserException
を拡張する最終 Java クラスにマップされ、それ以外の場合は OMG IDL struct
データ型のようにマップされます (Helper クラスと Holder クラスの生成を含む)。
例外が入れ子になった OMG IDL スコープ内 (本質的にインターフェイス内部) で定義される場合、その Java クラス名は特別なスコープ内で定義されます。それ以外の場合、その Java クラス名は例外の包含 OMG IDL モジュールに対応する Java パッケージのスコープ内で定義されます。
次に、ユーザ例外のサンプルを示します。
//コースへの登録を行う
try{
gRegistrarObjRef.register_for_courses(student_id, selected_course_numbers);
catch(UniversityT.TooManyCredits e)
}
{
System.err.println("TooManyCredits: " +e);
System.exit(1);
ActiveX クライアント・アプリケーション
ActiveX クライアント・アプリケーションは、Visual Basic エラー処理モデルを使用します。このモデルを使用すると、エラー発生時に特別なアクション (特定のエラー処理ルーチンへのジャンプなど) を実行できます。ActiveX クライアント・アプリケーションで例外が発生した場合、標準の Visual Basic エラー処理は期待通りに機能しますが、Visual Basic が例外に対して返すエラー情報の量は非常に限定されます。
Visual Basic は、組み込みの Error
オブジェクトの description
プロパティを通して発生する例外に関する追加情報を提供します。エラーが発生すると、説明文字列が設定され、発生したエラーの型が示されます。オブジェクトは、例外の定義済みのデータ型を返します。ユーザ例外には、それらを区別するために名前が付けられます。
Visual Basic エラー処理モデルを使用する場合、説明文字列には以下の情報が定義されます。
Visual Basic エラー処理モデルは、ユーザ例外のユーザ・データなど、例外固有の情報を返すことができません。
この欠点を補うため、CORBA オブジェクトの ActiveX ビューは、ユーザ例外を返す追加のオプション例外戻りパラメータを備えています。このオプション例外オブジェクトを提供した場合、Visual Basic 例外は発生しません。代わりに、この戻りパラメータは例外情報を返します。
例外が発生した場合、戻りパラメータにはその例外のデータを取得するためのオブジェクトが含まれます。このオブジェクトは、各値のプロパティを備えた構造疑似オブジェクトに似ています。例外の型を調べるには、例外オブジェクト・プロパティ EX_majorCode
または EX_minorCode
を使用します。EX_majorCode
オブジェクト・プロパティは、以下の 3 種類の値を取ることができます。
次に、例外を処理する Visual Basic のコード例を示します。
Dim exceptType As ExceptionType
Dim exceptInfo As DIForeignException
Set exceptInfo = Exc
exceptType = exceptInfo.EX_majorCode
Select Case exceptType
Case NO_EXCEPTION
msg = "No Exception" & vbCrLf
MsgBox msg
Case SYSTEM_EXCEPTION
' システム例外の場合、返されるバリアントは
' minorCode および completionStatus properties をサポートする
Dim minorCode As Long
Dim completionStatus As CORBA_CompletionStatus
Dim completionMsg As String
minorCode = exceptInfo.EX_minorCode
completionStatus = exceptInfo.EX_completionStatus
Select Case completionStatus
Case COMPLETION_NO
completionMsg = "No"
Case COMPLETION_YES
completionMsg = "Yes"
Case COMPLETION_MAYBE
completionMsg = "Maybe"
End Select
msg = "System Exception" & vbCrLf
msg = msg & " Minor Code = " & minorCode & vbCrLf
msg = msg & " Completion Status = " & completionMsg & vbCrLf
MsgBox msg
Case USER_EXCEPTION
' ユーザ例外の場合、返されるバリアントは
' 定義されたユーザ例外のプロパティをサポートする
msg = "User Exception" & vbCrLf
msg = msg & " Exception: " & exceptInfo.INSTANCE_repositoryId &
vbCrLf
MsgBox msg
End Select
|
Copyright © 2001, BEA Systems, Inc. All rights reserved.
|