(1)例外情報の設定
ユーザ例外を設定する場合は、CORBA_string_alloc()でユーザ例外を識別する文字列を設定する領域を獲得し、この領域に文字列をコピーします。続いて、IDLコンパイラで生成されたalloc関数でユーザ例外を設定する領域を獲得します。alloc関数名は、IDLで指定したインタフェース名、例外の識別名、およびallocを、アンダースコア(“_”)でつなげた形式で指定します。IDLで定義した例外情報はC言語では構造体になるので、構造体のメンバ変数に値を設定します。なお、今回使用した例では、ユーザ例外の識別情報を設定していません。最後に、CORBA_BOA_set_exception()でCORBA_Environment構造体に例外情報を設定します。
ODdemo_calculator_result ODdemo_calculator_calculate( ODdemo_calculator obj, CORBA_long a, CORBA_long b, CORBA_Environment *env ) { ODdemo_calculator_result res; : if( b == 0 ){ /* エラーZEROPARAMをenvに設定します */ CORBA_BOA_set_exception( boa, /* BOAオブジェクトリファレンス */ CORBA_USER_EXCEPTION, /* ユーザ例外 */ ex_ODdemo_calculator_ZEROPARAM, /* ユーザ例外の識別子 */ NULL, /* ユーザ例外の識別情報 */ env ); /* CORBA_Environment */ return( 0 ) ; } : return res; }
注意
サーバメソッドの引数に渡されるCORBA_Environment構造体を、サーバメソッド内部から他のメソッドを呼び出す場合の引数として使用しないでください。サーバメソッドの例外情報に、他のメソッドで発生したサーバメソッド内部の例外情報が設定されることになります。サーバメソッド内部から他のメソッドを呼び出す場合は、別のCORBA_Environment構造体を使用してください。
以下に正しいプログラム例、および誤ったプログラム例を示します。
ODdemo_calculator_result ODdemo_calculator_calculate( ODdemo_calculator obj, CORBA_long a, CORBA_long b, CORBA_Environment *env ) { CosNaming_NamingContext nc; CosNaming_Name name; CORBA_Object obj; CORBA_Environment local_env; /* 別のCORBA_Environment構造体を用意 */ memset( &local_env, 0, sizeof(CORBA_Environment) ); : /* * CosNaming_NamingContext_bind()の例外情報は、local_envに設定されるため、 * ODdemo_calculator_calculate()の例外情報として扱われることはない */ CosNaming_NamingContext_bind( nc, &name, obj, &local_env ); : }
ODdemo_calculator_result ODdemo_calculator_calculate( ODdemo_calculator obj, CORBA_long a, CORBA_long b, CORBA_Environment *env ) { CosNaming_NamingContext nc; CosNaming_Name name; CORBA_Object obj; : /* * CosNaming_NamingContext_bind()が例外復帰した場合、 * CosNaming_NamingContext_bind()の例外情報がODdemo_calculator_calculate()の * 例外情報として扱われてしまう */ CosNaming_NamingContext_bind( nc, &name, obj, env ); : }
(2)例外情報の獲得
サーバアプリケーションで例外を獲得する方法は、クライアントアプリケーションの例外処理と同様です。詳細については、“3.6 クライアントアプリケーションの例外処理”を参照してください。