クライアントアプリケーションは、サーバアプリケーションの処理が正常終了したか異常終了したかを知ることができます。異常終了時は、システムの異常/サーバアプリケーションの異常かを知ることができ、前者をシステム例外、後者をユーザ例外と呼びます。
メソッド呼出し時に指定した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); 
            ・
            ・
        }
            ・
            ・