ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)
Interstage

3.6 クライアントアプリケーションの例外処理

クライアントアプリケーションは、サーバアプリケーションの処理が正常終了したか異常終了したかを知ることができます。異常終了時は、システムの異常/サーバアプリケーションの異常かを知ることができ、前者をシステム例外、後者をユーザ例外と呼びます。
メソッド呼出し時に指定したCORBA_Environment構造体に、エラー情報が格納されます。
CORBA_Environment構造体を以下に示します。

typedef struct  {
    CORBA_enum  _major;
    CORBA_unsigned_long _minor;
        ・
        ・
} CORBA_Environment;

アプリケーションは、メソッドを呼び出す前にCORBA_Environment構造体の領域を初期化する必要があります。

CORBA_Environment env; 

memset( &env, 0, sizeof(CORBA_Environment));

_majorには、以下の値が設定されます。

CORBA_NO_EXCEPTION      : 正常終了
CORBA_SYSTEM_EXCEPTION  : システム例外
CORBA_USER_EXCEPTION    : ユーザ例外

(1)システム例外

次に示すようなシステム例外の値が設定されます。システム例外で通知されるデータ型は、文字列です。CORBA_exception_id()でCORBA_Environment構造体から文字列を取り出します。
システム例外を以下に示します。例外の意味については、“メッセージ集”の“CORBAサービスから通知される例外情報/マイナーコード”を参照してください。


例外情報

例外コード

BAD_CONTEXT

ex_CORBA_StExcep_BAD_CONTEXT

BAD_INV_ORDER

ex_CORBA_StExcep_BAD_INV_ORDER

BAD_OPERATION

ex_CORBA_StExcep_BAD_OPERATION

BAD_PARAM

ex_CORBA_StExcep_BAD_PARAM

BAD_QOS

ex_CORBA_StExcep_BAD_QOS

BAD_TYPECODE

ex_CORBA_StExcep_BAD_TYPECODE

CODESET_INCOMPATIBLE

ex_CORBA_StExcep_CODESET_INCOMPATIBLE

COMM_FAILURE

ex_CORBA_StExcep_COMM_FAILURE

CONTEXT

ex_CORBA_StExcep_CONTEXT

DATA_CONVERSION

ex_CORBA_StExcep_DATA_CONVERSION

FREE_MEM

ex_CORBA_StExcep_FREE_MEM

IMP_LIMIT

ex_CORBA_StExcep_IMP_LIMIT

INITIALIZE

ex_CORBA_StExcep_INITIALIZE

INTERNAL

ex_CORBA_StExcep_INTERNAL

INTF_REPOS

ex_CORBA_StExcep_INTF_REPOS

INV_FLAG

ex_CORBA_StExcep_INV_FLAG

INV_IDENT

ex_CORBA_StExcep_INV_IDENT

INV_OBJREF

ex_CORBA_StExcep_INV_OBJREF

INV_POLICY

ex_CORBA_StExcep_INV_POLICY

MARSHAL

ex_CORBA_StExcep_MARSHAL

NO_IMPLEMENT

ex_CORBA_StExcep_NO_IMPLEMENT

NO_MEMORY

ex_CORBA_StExcep_NO_MEMORY

NO_PERMISSION

ex_CORBA_StExcep_NO_PERMISSION

NO_RESOURCES

ex_CORBA_StExcep_NO_RESOURCES

NO_RESPONSE

ex_CORBA_StExcep_NO_RESPONSE

OBJ_ADAPTER

ex_CORBA_StExcep_OBJ_ADAPTER

PERSIST_STORE

ex_CORBA_StExcep_PERSIST_STORE

REBIND

ex_CORBA_StExcep_REBIND

TIMEOUT

ex_CORBA_StExcep_TIMEOUT

TRANSIENT

ex_CORBA_StExcep_TRANSIENT

UNKNOWN

ex_CORBA_StExcep_UNKNOWN

INVALID_TRANSACTION

ex_CORBA_StExcep_INVALID_TRANSACTION

TRANSACTION_MODE

ex_CORBA_StExcep_TRANSACTION_MODE

TRANSACTION_REQUIRED

ex_CORBA_StExcep_TRANSACTION_REQUIRED

TRANSACTION_ROLLEDBACK

ex_CORBA_StExcep_TRANSACTION_ROLLEDBACK

TRANSACTION_UNAVAILABLE

ex_CORBA_StExcep_TRANSACTION_UNAVAILABLE


システム例外発生時には、CORBA_Environment構造体の_minorにマイナーコードが設定されます。マイナーコードの値については、“メッセージ集”の“CORBAサービスから通知される例外情報/マイナーコード”を参照してください。


(2)ユーザ例外

ユーザ例外でも文字列でエラー情報が通知されるため、CORBA_exception_id()でCORBA_Environment構造体から取り出します。また、IDLで定義したユーザ定義情報の詳細については、CORBA_exception_value()でCORBA_Environment構造体から取り出します。


(3)例外情報の獲得

例外情報を獲得する例を以下に示します。

/* メソッドの呼出し */
ret = ODdemo_calculator_calculate(obj, a, b, &env); 

switch(env._major){ 
    case CORBA_SYSTEM_EXCEPTION: 
        /* システム例外のエラー処理 */
        id = CORBA_exception_id(&env); 
        
        if ( strcmp (id, ex_CORBA_StExcep_COMM_FAILURE) == 0 ) {
          /* マイナーコードの獲得 */
          fprintf( stderr, "SystemException:COMM_FAILURE (minor = %x)\n", env._minor); 
            ・
            ・
        }
            ・
            ・
    case CORBA_USER_EXCEPTION: 
        /* ユーザ例外のエラー処理 */
        id = CORBA_exception_id(&env);
        
        if ( strcmp (id, ex_exp_exc) == 0 ) {
            uexc  =  (exp_exc *)CORBA_exception_value(&env); 
            ・
            ・
        }
            ・
            ・