Borland(R) Enterprise Server VisiBroker(R) デベロッパーズガイド

[目次][索引][前へ][次へ]

5.2 システム例外

オブジェクトインプリメンテーションは,「20. VisiBroker 4.xインタセプタの使用」で説明しているインタセプタを介してシステム例外を発生させることができますが,通常はVisiBroker ORBがシステム例外を発生させます。

主要なCORBA例外の一覧とVisiBroker ORBがその例外を発生させた理由を表5-1に示します。また,CORBA例外のマイナーコードを表5-2に示します。

表5-1 主要なCORBA例外,および考えられる原因

例外 例外の内容 考えられる原因
CORBA::BAD_CONTEXT サーバに無効コンテキストが渡されました。 クライアントがオペレーションを呼び出したが,渡されたコンテキストにオペレーションで必要なコンテキスト値がない場合に,オペレーションはこの例外を発生します。
CORBA::BAD_INV_ORDER オペレーション要求の前に,必要な前提条件オペレーションが呼び出されていません。
  • リクエストを実際に送信する前に,CORBA::Request::get_response()メソッドかCORBA::Request::poll_response()メソッドを呼び出そうとした可能性があります。
  • C++ ORBでは,リモートメソッド呼び出しのインプリメンテーション外で,exception::get_client_info()メソッドを呼び出そうとした可能性があります。この関数が有効なのは,リモート呼び出しのインプリメンテーション内だけです。
  • すでにシャットダウンされたVisiBroker ORBでオペレーションが呼び出されました。
CORBA::BAD_OPERATION 無効なオペレーションが実行されました。
  • サーバは,IDLで定義されていないオペレーションを受信すると,この例外を発生させます。クライアントとサーバが,同じIDLからコンパイルされているかどうかを確認してください。
  • リクエストが,リターン値を使用するように設定されていないと,CORBA::Request::return_value()メソッドはこの例外を発生させます。DII呼び出しをする時にリターン値が期待される場合には,必ず,CORBA::Request::set_return_type()メソッドを呼び出してリターン値型を設定してください。
CORBA::BAD_PARAM 無効なパラメタが引き渡されました。
  • sequence型の無効インデックスにアクセスしようとすると発生します。必ず,length()メソッドを使用してシーケンスの長さを設定してから,そのシーケンスの要素を格納または検索してください。
  • Java ORBでは,列挙体のデータの範囲外の値を送信しようとした可能性があります。
  • 無効なTCKindを指定してTypeCodeを構築しようとした可能性があります。
  • nilまたはNULLオブジェクトリファレンスをAnyに挿入しようとした可能性があります。
  • DIIとonewayメソッド呼び出しを使用してout引数が指定された可能性があります。
  • インタフェースリポジトリに登録するインプリメンテーションオブジェクトの登録情報(例えば登録名)がすでに存在している場合,インタフェースリポジトリはこの例外を発生させます。
  • C++ ORBでは,無効なCORBA::Object_ptrがin引数として渡されると(例えば,nilリファレンスが渡されると),この例外を発生させます。
  • C++ ORBでは,NULLポインタの送信が試行されるとこの例外を発生させます。例えば,リターン値としてNULLを返そうとしたり,sequenceを返さなければならないメソッドからoutパラメタを返そうとすると,この例外が発生します。この場合,新しいsequence(長さは0の可能性がある)が代わりに返されなければなりません。NULL値で送信できないタイプには,Any,Context,struct,またはsequenceが含まれます。
  • Java ORBでは,nullリファレンスが渡されると,この例外を発生させます。
CORBA::BAD_TYPECODE ORBが不正なTypeCodeを検出しました。
CORBA::CODESET_INCOMPATIBLE クライアントとサーバのコードセットに互換がないため,通信に失敗しました。 クライアントとサーバが使用するコードセットが,一致していません。例えば,クライアントはISO 8859-1を使用し,サーバは日本語コードセットを使用しています。
CORBA::COMM_FAILURE 通信障害が発生しました。 C++ORBでは,一端のコネクション障害によって,既存のコネクションがクローズすることがあります。また,クライアントマシンまたはサーバマシンのリソース制限によって(最大コネクション数に到達し)通信が失敗した場合,この例外が発生します。
Java ORBでは,オペレーションの進行中(クライアントがリクエストを送信後で,サーバからクライアントに応答が返される前)に通信が損失すると,この例外が発生します。
CORBA::DATA_CONVERSION データ変換エラーが発生しました。 マーシャリングで不正な文字コードを検出した場合,この例外が発生します。
CORBA::IMP_LIMIT インプリメンテーションの上限に違反しました。
CORBA::INITIALIZE 必要な初期化が実行されませんでした。 ORB_init()メソッドまたはORB.init()メソッドが呼び出されなかった可能性があります。VisiBroker ORB対応のオペレーションを実行する前には,クライアントは,C++アプリケーションの場合はORB_init()メソッドを,Javaアプリケーションの場合はORB.init()メソッドを呼び出す必要があります。この呼び出しは通常,mainルーチンの最上部でプログラムが起動されるとすぐに実行されます。
Java ORBでは,起動時に指定するオプションに不正値を設定したおそれがあります。例えば,vbroker.orb.gcTimeoutにマイナスの値を設定した場合が該当します。
CORBA::INTERNAL 内部エラーが発生しました。 VisiBroker ORBの内部データ構造が破壊されるなど,ORB内部で論理矛盾を検出した場合に発生します。
CORBA::INTF_REPOS インタフェースリポジトリへのアクセスエラーが発生しました。 get_interface()メソッドの呼び出し時に,オブジェクトインプリメンテーションがIRを見つけられないと,クライアントでこの例外が発生します。IRが実行されていることを確認してください。また,リクエストされたオブジェクトのインタフェース定義が,IRにロードされていることを確認してください。
CORBA::INV_IDENT 識別子の構文が無効です。 IRに渡された識別子の書式が正しくありません。
不当なオペレーション名が動的起動インタフェースで使用されています。
CORBA::INV_OBJREF 無効なオブジェクトリファレンスが検出されました。 使用できるプロファイルが指定されていないオブジェクトリファレンスが取得されると,VisiBroker ORBはこの例外を発生させます。
文字列型オブジェクトリファレンスの先頭文字が「IOR:」でないと,CORBA::ORB::string_to_object()メソッドは,この例外を発生させます。
CORBA::INV_POLICY 無効なポリシーの変更が検出されました。 この例外は,どの呼び出しからも発生する可能性があります。特定の呼び出しに適用されるポリシーの変更同士で互換性がないために呼び出しができない場合に発生します。
CORBA::INVALID_TRANSACTION トランザクションコンテキストが不正です。 この例外の詳細については,トランザクションサービスのドキュメントを参照してください。
CORBA::MARSHAL マーシャルパラメタまたは結果が不当です。 ネットワークからの要求または応答が構造的に不当です。このエラーは,通常,クライアント側またはサーバ側のランタイムのどちらかのバグを示します。例えば,サーバからの応答で,メッセージが1000バイトであるが,実際のメッセージが1000バイトより短いか長いことを示す場合,VisiBroker ORBはこの例外を発生させます。MARSHAL例外はDIIやDSIを不当に使用しても発生します。例えば,送信された実際のパラメタの型がオペレーションのIDLシグニチャと一致しない場合です。
CORBA::NO_IMPLEMENT リクエストオブジェクトが見つかりませんでした。 呼び出されたオペレーションがある(IDL定義がある)のに,そのオペレーションのインプリメンテーションがないことを示します。
CORBA::NO_PERMISSION 許可されていないオペレーションを実行しようとしました。
CORBA::NO_RESOURCES 必要な資源を取得できませんでした。
  • 新しいスレッドが生成できない場合に,この例外が発生します。
  • リモートクライアントがコネクションを確立しようとした時に,サーバがファイルディスクリプタを使い果たすなどしてソケットを生成できないと,サーバはこの例外を発生させます。
  • ファイルディスクリプタを使い果たしたなどの理由でコネクションの確立が失敗すると,クライアントも同じようにこの例外を発生させます。
  • C++ORBでは,メモリを使い切った場合にもこの例外が発生します。
CORBA::NO_RESPONSE クライアントが送信したリクエストの応答がまだありません。 OADに登録したオブジェクトインプリメンテーションの活性化が,OADに指定した時間内に行われなかった場合に,この例外が発生します。
CORBA::OBJ_ADAPTER オブジェクトアダプタが障害を検出しました。 アプリケーションのサーバントマネージャの問題を検出した場合などに,POAはこの例外を発生させます。
CORBA::OBJECT_NOT_EXIST リクエストされたオブジェクトが存在していません。
  • 該当するサーバ内に存在しないインプリメンテーションでオペレーションを実行しようとすると,サーバは,この例外を発生させます。
  • 非活性化したインプリメンテーションでオペレーションを起動しようとすると,この例外がクライアントによって表示されます。
例えば,オブジェクトへのバインドが失敗,または自動リバインドが失敗すると,OBJECT_NOT_EXIST例外が発生します。
CORBA::REBIND クライアントが,QoSポリシーに矛盾するIORを受信しました。 設定されたQoSポリシーに矛盾するIORをクライアントが取得するとこの例外が発生します。RebindPolicyにNO_REBIND,NO_RECONNECT,またはVB_NOTIFY_REBINDの値があると,バインドされたオブジェクトリファレンスの呼び出しの結果,オブジェクト転送メッセージやロケーション転送メッセージが生成されます。
CORBA::TIMEOUT オペレーションがタイムアウトしました。 コネクションを設定しようとしている時,またはリクエストの送受信の完了を待っているときに,指定時間前にオペレーションが完了しないと,TIMEOUT例外が発生します。
CORBA::TRANSACTION_REQUIRED リクエスト時に無効なトランザクションコンテキストがトランザクションサービスに渡されましたが,アクティブなトランザクションが必要です。 この例外の詳細については,トランザクションサービスのドキュメントを参照してください。
CORBA::TRANSACTION_ROLLEDBACK リクエストに対応するトランザクションがすでにロールバックされているか,またはロールバック用にマーキングされています。 この例外の詳細については,トランザクションサービスのドキュメントを参照してください。
CORBA::TRANSIENT 通信エラーが検出されましたが,再接続できる場合があります。 通信障害が発生したおそれがありますが,VisiBroker ORBは通信が失敗したサーバとリバインドする必要があるとシグナル通知しています。RebindPolicyの設定によっては,この例外は発生しません。
CORBA::UNKNOWN 未知の例外です。
  • サーバが発生させたのは,Javaランタイム例外などの適切な例外ではありません。
  • サーバとクライアント間にIDL不一致があり,クライアントプログラムで,この例外は定義されていません。
  • DIIでは,サーバがコンパイル時にクライアントに未知の例外を発生させ,クライアントがCORBA::Requestの例外リストを指定しなかった場合です。
サーバがJavaアプリケーションの場合は,vbroker.orb.warn=2プロパティを設定して,どのランタイム例外が問題の原因かを調べます。

(凡例)-:該当しない


 

表5-2 CORBA例外のマイナーコード

システム例外 マイナーコード 説明
BAD_PARAM 1 値ファクトリの登録,登録解除,または探索に失敗しました。
2 RIDがすでにIRに定義されています。
3 名前がすでにIRのコンテキストで使用されています。
4 ターゲットが有効なコンテナではありません。
5 継承されたコンテキストで名前がクラッシュしました。
6 abstractインタフェースのタイプが正しくありません。
MARSHAL 1 値ファクトリを探索できません。
NO_IMPLEMENT 1 ローカル値インプリメンテーションがありません。
2 値のインプリメンテーションバージョンの互換性がありません。
BAD_INV_ORDER 1 IRに依存性が存在し,オブジェクトがデストラクトできません。
2 IR内のデストラクトできないオブジェクトをデストラクトしようとしました。
3 オペレーションがデッドロックになりました。
4 VisiBroker ORBがシャットダウンしました。
OBJECT_NOT_EXIST 1 活性化されていない(登録解除されている)値をオブジェクトリファレンスとして渡そうとしました。

 

コードサンプル5-1 SystemExceptionクラス(C++)
 
class SystemException : public CORBA::Exception {
   public:
      static const char*_id;
      virtual ~SystemException();
      CORBA::ULong minor() const;
      void minor(CORBA::ULong val);
      CORBA::CompletionStatus completed() const;
      void completed(CORBA::CompletionStatus status);
      . . .
      static SystemException *_downcast(Exception *exc);
      . . .
};
 

コードサンプル5-2 SystemExceptionクラス(Java)
 
public abstract class org.omg.CORBA.SystemException
                        extends java.lang.RuntimeException {
   protected SystemException(java.lang.String reason,
      int minor,CompletionStatus completed) {...}
   public String toString() {...}
   public CompletionStatus completed;
   public int minor;
}
 
<この節の構成>
5.2.1 完了状態の取得
5.2.2 マイナーコードの取得と設定(C++)
5.2.3 システム例外のタイプの判定(C++)
5.2.4 システム例外のキャッチ
5.2.5 システム例外への例外のダウンキャスト