| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第5章 アプリケーションの開発(C++言語) | > 5.1 クライアントアプリケーションのプログラミング |
クライアントアプリケーションは、サーバアプリケーションの処理が正常終了したか異常終了したかを知ることができます。異常終了した場合には、システムの異常か、サーバアプリケーションの異常かを知ることができ、前者をシステム例外、後者をユーザ例外と呼びます。システム例外クラスを以下に示します。例外の意味については、“メッセージ集”の“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を使用してエラーの判定を行う必要があります。IDLcでスタブを作成する際にnoexオプションを指定した場合は、サーバアプリケーションのメソッド呼出し時のエラー判定にCORBA::Environmentクラスに格納された情報を使用します。IDLcの詳細については“リファレンスマニュアル(コマンド編)”を参照してください。
tryブロックで例外をハンドルするために、例外クラスに対応するcatchブロックを定義しておきます。例外が発生すると、例外クラスに対応するcatchブロックが実行されます。
システム例外は、親クラスとしてCORBA::SystemExceptionを継承し、その派生したクラスとして各詳細情報を定義したクラスCORBA::StExcep::UNKNOWN, CORBA::StExcep::BAD_PARAM等があります。
システム例外の場合はCORBA::SystemExceptionクラスをcatch文で利用すれば、エラー情報を一括して受けることができます。もし、システム例外、ユーザ例外で、エラー処理の区別が必要でなければ、上位クラスである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 ) {
// エラー処理
}
例外処理用の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 ) ){
・ // エラー処理
・
}
}
}
目次
索引
![]()
|