例外


CORBA では、OMG で完全に規定された標準システム例外と、アプリケーションプログラマが定義するユーザ例外の 2 種類の例外があります。CORBA の例外は Java の例外オブジェクトとは多少異なりますが、その違いの大部分は IDL から Java へのマッピング時に解決されます。

このページでは、次の内容について説明します。

CORBA の例外と Java の例外の違い

IDL で例外を指定するときは、キーワード raises を使用します。これは、Java で throws を指定するのと同様です。IDL でこの例外キーワードを使用する場合は、ユーザ定義例外を作成することになります。標準システム例外では、このような指定をする必要はなく、また、このような指定をすることはできません。

システム例外

CORBA では、一連の標準システム例外が定義されています。標準システム例外は、次のようなシステム関連のエラー状態の発生を知らせるため、一般に ORB ライブラリによって生成されます。

システム例外は、呼び出されたすべての IDL オペレーションに対してスローされる可能性があります。インタフェースの設計者は、インタフェース内のオペレーションでシステム例外をスローできるような仕様にする必要はありません。この処理は自動で行われます。

オペレーションの実装がどれほど単純であったとしても、別のプロセス (多くが別のマシン上のプロセス) であるクライアントからオペレーション呼び出しが行われることにより、あらゆるエラーが発生する可能性があるため、この仕様は妥当であるといえます。

したがって、CORBA クライアントでは、CORBA のシステム例外を常にキャッチするようにすべきです。また、CORBA のシステム例外は java.lang.RuntimeException の下位クラスになるため、キャッチすべきシステム例外の通知を Java コンパイラに任せることはできません。

システム例外の構造

CORBA のシステム例外は、すべて次のような同じ構造をしています。

exception <SystemExceptionName> { // descriptive of error
    unsigned long minor;          // more detail about error
    CompletionStatus completed;   // yes, no, maybe
}
 

システム例外は、java.lang.RuntimeException から org.omg.CORBA.SystemException までのクラスのサブタイプです。

java.lang.Exception
 |
 +--java.lang.RuntimeException
     |
     +--org.omg.CORBA.SystemException
         |
         +--BAD_PARAM
         |
         +--//etc. 
 

マイナーコード

CORBA のすべてのシステム例外には、例外発生の原因となったエラーに関する付加的情報を提供するマイナーコードフィールドが設けられています。マイナーコードの意味は OMG では規定されておらず、各 ORB ベンダーが、その実装ごとに適切なマイナーコードを規定することになっています。Java  ORB によって規定されているマイナーコードの意味については、「マイナーコードの意味」を参照してください。

完了状態

CORBA のすべてのシステム例外には、例外をスローしたオペレーションの状態を表す完了状態フィールドがあります。完了状態コードには、次の 3 つがあります。

COMPLETED_YES
オブジェクトの実装は、例外が起こる前に処理を完了した
COMPLETED_NO
オブジェクトの実装は、例外が起こる前に呼び出されなかった
COMPLETED_MAYBE
呼び出しの状態が不明

ユーザ例外

CORBA のユーザ例外は、java.lang.Exception から org.omg.CORBA.UserException までのクラスのサブタイプです。

java.lang.Exception
 |
 +--org.omg.CORBA.UserException
      |
      +-- Stocks.BadSymbol
      |
      +--//etc. 

各ユーザ定義例外は、生成された Java 例外クラスの IDL の結果の中で規定します。ユーザ定義例外は、すべてプログラマが定義し、実装します。

マイナーコードの意味

すべてのシステム例外には、CORBA ベンダーが例外発生の原因に関する付加的情報を提供できるように、minor というフィールドが設けられています。Java IDL のシステム例外のマイナーコードとその意味を、次の表に示します。

ORB のマイナーコードとその意味
コード 意味
BAD_PARAM 例外のマイナーコード
1 Java IDL メソッドに null パラメータが渡された
COMM_FAILURE 例外のマイナーコード
1 オブジェクト参照、または、位置/オブジェクト転送後に取得したオブジェクト参照で指定されたホストとポートに接続できない
2 ソケットへの書き込み試行中にエラーが発生した。ソケットは、他方によって閉じられたか、異常終了している
3 ソケットへの書き込み試行中にエラーが発生した。現在、接続は存在しない
6 サーバへの接続を何回か試みたが、失敗した
DATA_CONVERSION 例外のマイナーコード
1 ORB の string_to_object オペレーション中、無効な 16 進文字を発見した
2 string_to_object() に指定した IOR の長さが奇数である。偶数を指定すること
3 string_to_object() に指定した文字列が IOR: で始まっていない。IOR の文字列化が無効
4 ホストまたはポートが不正であるかまたは指定されていないため、ORB の resolve_initial_references オペレーションを実行できない。または、リモートホストが Java IDL ブートストラッププロトコルをサポートしていない
INTERNAL 例外のマイナーコード
3 サーバにより、IIOP 応答 メッセージに無効なステータスが返された
6 非整列化時、ユーザ例外のリポジトリ ID が不正な長さであることが発見された
7 Java API の InetAddress.getLocalHost().getHostName() でローカルホスト名を特定できない
8 特定のポート上にリスナースレッドを作成できない。ポートがすでに使用中か、デーモンスレッドの作成中にエラーが発生したか、セキュリティ上の制限により待機できないようになっている
9 IIOP ロケート応答で無効なロケート応答ステータスが見つかった
10 オブジェクト参照の文字列化中、エラーが発生した
11 無効な GIOP v1.0 メッセージタイプの IIOP メッセージが見つかった
14 ユーザ例外の非整列化中、エラーが発生した
18 内部初期化エラー
INV_OBJREF 例外のマイナーコード
1 プロファイルのない IOR が見つかった
MARSHAL 例外のマイナーコード
4 オブジェクト参照の非整列化中、エラーが発生した
5 ワイド文字やワイド文字列など、サポートされていないタイプの IDL の整列化または非整列化が行われた
6 文字または文字列の整列化または非整列化中、ISO Latin-1 (8859.1) に準拠していない文字が見つかった。0 〜 255 の範囲の文字ではない
NO_IMPLEMENT 例外のマイナーコード
1 Dynamic Skeleton Interface が実装されていない
OBJ_ADAPTER 例外のマイナーコード
1 サーバ側で発生した要求をオブジェクトアダプタ層にディスパッチ中、オブジェクトキー内に対応するオブジェクトアダプタが見つからなかった
2 サーバ側で発生したロケート要求をオブジェクトアダプタ層にディスパッチ中、オブジェクトキー内に対応するオブジェクトアダプタが見つからなかった
4 サーバントを ORB に接続試行中、エラーが発生した
OBJ_NOT_EXIST 例外のマイナーコード
1 ロケート要求の結果、ロケータにとってそのオブジェクトが未知であることを表す応答が返された
2 その要求を受け取ったサーバのサーバ ID は、呼び出しが行われたオブジェクト参照のオブジェクトキーに書き込まれたサーバ ID に一致しない
4 オブジェクト参照内のオブジェクトキーの内容に対応するスケルトンがサーバ側で見つからない
UNKNOWN 例外のマイナーコード
1 非整列化中、未知のユーザ例外が見つかった。サーバは、クライアントが期待するものに一致しないユーザ例外を返した
3 未知の実行時例外がサーバの実装によりスローされた

ネームサーバのマイナーコードとその意味
コード 意味
INITIALIZE 例外のマイナーコード
150 一時ネームサービスは、初期化中、SystemException をキャッチした
151 一時ネームサービスは、初期化中、Java の例外をキャッチした
INTERNAL 例外のマイナーコード
100 rebind オペレーション中、AlreadyBound 例外がスローされた
101 rebind_context オペレーション中、AlreadyBound 例外がスローされた
102 内部のバインド実装に渡されたバインド型は、BindingType.nobject でも BindingType.ncontext でもない
103 オブジェクト参照はコンテキストとしてバインドされているが、CosNaming.NamingContext にナロー変換できなかった
200 bind オペレーションの実装は、以前のバインド処理に遭遇した
201 list オペレーションの実装は、リスト反復子の作成中、Java の例外をキャッチした
202 new_context オペレーションの実装は、新しい NamingContext サーバントの作成中、Java の例外をキャッチした
203 destroy オペレーションの実装は、ORB の切り離し中、Java の例外をキャッチした


ホーム


Copyright © 1996-98 Sun Microsystems, Inc., 2550 Garcia Ave., Mtn. View, CA. 94043-1100 USA., All rights reserved.