Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第5章 アプリケーションの開発(C++言語)> 5.1 クライアントアプリケーションのプログラミング

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

 クライアントアプリケーションは、サーバアプリケーションの処理が正常終了したか異常終了したかを知ることができます。異常終了した場合には、システムの異常か、サーバアプリケーションの異常かを知ることができ、前者をシステム例外、後者をユーザ例外と呼びます。システム例外クラスを以下に示します。例外の意味については、“メッセージ集”の“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の詳細については“リファレンスマニュアル(コマンド編)”を参照してください。

(1)try−catchを使用する場合

 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 ) {
      // エラー処理
  }

(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 ) ){ 
              ・                         // エラー処理
              ・
          }
      }
  }

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005