クライアントアプリケーションは、サーバアプリケーションの処理が正常終了したか異常終了したかを知ることができます。異常終了した場合は、システムの異常/サーバアプリケーションの異常かを知ることができ、前者をシステム例外、後者をユーザ例外と呼びます。システム例外クラスを以下に示します。例外の意味については、“メッセージ集”の“CORBAサービスから通知される例外情報/マイナーコード”を参照してください。
例外情報  | 例外クラス  | 
|---|---|
BAD_CONTEXT  | CORBA::StExcep::BAD_CONTEXT  | 
BAD_INV_ORDER  | CORBA::StExcep::BAD_INV_ORDER  | 
BAD_OPERATION  | CORBA::StExcep::BAD_OPERATION  | 
BAD_PARAM  | CORBA::StExcep::BAD_PARAM  | 
BAD_QOS  | CORBA::StExcep::BAD_QOS  | 
BAD_TYPECODE  | CORBA::StExcep::BAD_TYPECODE  | 
CODESET_INCOMPATIBLE  | CORBA::StExcep::CODESET_INCOMPATIBLE  | 
COMM_FAILURE  | CORBA::StExcep::COMM_FAILURE  | 
CONTEXT  | CORBA::StExcep::CONTEXT  | 
DATA_CONVERSION  | CORBA::StExcep::DATA_CONVERSION  | 
FREE_MEM  | CORBA::StExcep::FREE_MEM  | 
IMP_LIMIT  | CORBA::StExcep::IMP_LIMIT  | 
INITIALIZE  | CORBA::StExcep::INITIALIZE  | 
INTERNAL  | CORBA::StExcep::INTERNAL  | 
INTF_REPOS  | CORBA::StExcep::INTF_REPOS  | 
INV_FLAG  | CORBA::StExcep::INV_FLAG  | 
INV_IDENT  | CORBA::StExcep::INV_IDENT  | 
INV_OBJREF  | CORBA::StExcep::INV_OBJREF  | 
INV_POLICY  | CORBA::StExcep::INV_POLICY  | 
MARSHAL  | CORBA::StExcep::MARSHAL  | 
NO_IMPLEMENT  | CORBA::StExcep::NO_IMPLEMENT  | 
NO_MEMORY  | CORBA::StExcep::NO_MEMORY  | 
NO_PERMISSION  | CORBA::StExcep::NO_PERMISSION  | 
NO_RESOURCES  | CORBA::StExcep::NO_RESOURCES  | 
NO_RESPONSE  | CORBA::StExcep::NO_RESPONSE  | 
OBJ_ADAPTER  | CORBA::StExcep::OBJ_ADAPTER  | 
PERSIST_STORE  | CORBA::StExcep::PERSIST_STORE  | 
REBIND  | CORBA::StExcep::REBIND  | 
TIMEOUT  | CORBA::StExcep::TIMEOUT  | 
TRANSIENT  | CORBA::StExcep::TRANSIENT  | 
UNKNOWN  | CORBA::StExcep::UNKNOWN  | 
INVALID_TRANSACTION  | CORBA::StExcep::INVALID_TRANSACTION  | 
TRANSACTION_MODE  | CORBA::StExcep::TRANSACTION_MODE  | 
TRANSACTION_REQUIRED  | CORBA::StExcep::TRANSACTION_REQUIRED  | 
TRANSACTION_ROLLEDBACK  | CORBA::StExcep::TRANSACTION_ROLLEDBACK  | 
TRANSACTION_UNAVAILABLE  | CORBA::StExcep::TRANSACTION_UNAVAILABLE  | 
システム例外発生時は、CORBA::SystemException::minor()を使用してマイナーコードを獲得します。マイナーコードの値については、“メッセージ集”の“CORBAサービスから通知される例外情報/マイナーコード”を参照してください。
エラーは、以下の方法で判定します。
try-catchを使用する方法
メソッド呼出し時に指定したCORBA::Environmentクラスに格納された情報を使用する方法
通常、try-catchを使用してエラーを判定する必要があります。IDLcでスタブを作成する際にnoexオプションを指定した場合は、サーバアプリケーションのメソッド呼出し時のエラー判定に、CORBA::Environmentクラスに格納された情報を使用します。IDLcの詳細については、“リファレンスマニュアル(コマンド編)”を参照してください。
tryブロックで例外をハンドルするために、例外クラスに対応するcatchブロックを定義しておきます。例外が発生すると、例外クラスに対応するcatchブロックが実行されます。
システム例外は、親クラスとしてCORBA::SystemExceptionを継承し、その派生したクラスとして各詳細情報を定義したクラスCORBA::StExcep::UNKNOWN、CORBA::StExcep::BAD_PARAMなどがあります。
システム例外を受ける場合は、catch文でCORBA::SystemExceptionクラスを指定します。もし、システム例外/ユーザ例外で、エラー処理の区別が必要でなければ、上位クラスであるCORBA::Exceptionをcatch文で指定すれば、すべて一括して受けることができます。
// ユーザ例外の参照
CORBA::Environment    env; 
CORBA::Long           l; 
CORBA::ULong          minor;  // マイナーコード
try {
    obj->op(env); 
} catch ( CORBA::SystemException &systemerr ) {
    minor = systemerr.minor(); // マイナーコードの獲得
    // エラー処理
} catch( ODdemo::calculator::ZEROPARAM &errcode ){ 
    // エラー処理
}
または
CORBA::Environment    env; 
CORBA::Long           l; 
try {
    obj->op(env); 
} catch ( CORBA::Exception &e ) {
    // エラー処理
}(2)CORBA::Environmentクラスによる判定方法
例外処理用のCORBA::Environmentクラスを使用して、例外を判定します。
CORBA::Environmentクラスを以下に示します。
class Environment
{
public: 
    void exception(Exception *);
    Exception *exception() const; 
    void clear();
}メンバ関数のexception()に対して、エラーが発生したかどうかを問い合わせます。結果として復帰値にNULLが設定された場合は、正常終了です。異常終了の場合は、以下のどちらかの例外クラスへのポインタが設定されます。
CORBA::SystemException:システム例外
CORBA::UserException:ユーザ例外
システム例外が発生したかどうかをSystemExceptionクラスの_narrowメソッドを呼び出して、その結果を判定します。結果が真の場合、システム例外と判断できます。また、どのエラーが発生したかを知るには、システム例外の詳細クラスの_narrowメソッドを呼び出して、その結果を判定します。結果が真の場合、そのエラー詳細クラスと判断できます。
ユーザ例外が発生したかどうかをUserExceptionクラスの_narrowメソッドを呼び出して、その結果を判定します。結果が真の場合、ユーザ例外と判断できます。その後、_valueメソッドを呼び出して、ユーザ例外の詳細を取り出します。
例外情報を獲得する例を以下に示します。
// 例外の参照
CORBA::Environment      *env;           // CORBA::Environmentクラス
CORBA::Exception        *exc;           // CORBA::Exceptionクラス
CORBA::SystemException  *systemerr;     // CORBA::SystemExceptionクラス
CORBA::UNKNOWN          *sys_unknown;   // 未知のエラー
CORBA::BAD_PARAM        *sys_bad_param; // パラメタエラー
           :
           :
CORBA::UserException    *usererr;       // CORBA::UserExceptionクラス
ODdemo::calculator::ZEROPARAM *errcode; // エラー詳細
CORBA::ULong            minor;          // マイナーコード
env = new CORBA::Environment; 
result = ap->divide(2,  3, *env);       // メソッドの呼出し
if( exc = env->exception() ){ 
    if( systemerr = SystemException::_narrow(exc)) {    // システム例外
        minor = systemerr->minor();     // マイナーコードの獲得
        if( sys_unknown = CORBA::UNKNOWN::_narrow( systemerr) ){ 
            :                           // エラー処理
            :
        }
        if( sys_bad_param = CORBA::BAD_PARAM::_narrow( systemerr) ){ 
            :                           // エラー処理
            :
        }
    } else if( usererr = UserException::_narrow(exc)) { // ユーザ例外
        if( errcode = ODdemo::calculator::ZERODIVIDE::_narrow( usererr ) ){ 
            :                           // エラー処理
            :
        }
    }
}