CORBA には次の 2 種類の例外があります。OMG で完全に規定された標準システム例外と、アプリケーションプログラマが定義するユーザ例外の 2 つです。CORBA の例外は Java の例外オブジェクトとは多少異なりますが、その違いの大部分は IDL から 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 つがあります。
CORBA のユーザ例外は、java.lang.Exception から org.omg.CORBA.UserException までのクラスのサブタイプです。
java.lang.Exception | +--org.omg.CORBA.UserException | +-- Stocks.BadSymbol | +--//etc.
各ユーザ定義例外は、生成された Java 例外クラスの IDL の結果の中で規定します。ユーザ定義例外は、すべてプログラマが定義し、実装します。
マイナーコードの意味
すべてのシステム例外には、CORBA ベンダーが例外発生の原因に関する付加的情報を提供できるように、minor というフィールドが設けられています。OMG の標準マイナーコード例外 (OMGVMCID) のリストについては、OMG のドキュメント (http://www.omg.org/docs/omg/03-01-04.txt) を参照してください。
よく遭遇する Sun のマイナーコード例外には、次のようなものがあります。
java.net.SocketException
が原因で生じることがあり、通常は BindException
、ConnectException
、または NoRouteToHostException
のいずれかです。
次のような点を確認する必要があります。
-ORBInitialHost
および -ORBInitialPort
の値が正しく設定されているか。どのように設定したらよいか分からない場合は、「ネームサービスの起動と停止」を参照してください。
Unable to create the listener thread on the specific port. Either the post is taken or there was an error creating the daemon thread
」 を意味します。これは一般に、ネームサービスを実行しようとしたポートが別のプロセスによって使用中であることを示しています。Solaris 上で実行している場合には、このポートで別のプロセスが実行中かどうかを調べるために、端末プロンプトで次のコマンドを実行します。
netstat | grep port_number
corba.INSSubcontract.getINSReference
です。
wchar
か wstring
のいずれかを送信しようとしたことを意味します。これは、仕様で許可されていません。
org.omg.CORBA.Object
から派生したオブジェクトを整列化しようとしたが、その特定のインスタンスが ORB に接続されていないことを意味します。POA を使用する場合は、まずオブジェクトを POA に登録する必要があります。オブジェクトを POA に登録する方法の詳細については、POA のドキュメントまたはチュートリアルを参照してください。
write_string
や write_octet_array
などの write
メソッドに対して Java の null
を渡したときに発生します。Java メソッドの結果として Java の null
を返すことはできません。
Unable to determine local hostname using InetAddress.getLocalHost().getHostName()
」を意味します。
ORB は、InetAddress.getLocalHost().getHostName()
を使用して、参照の検索やバインドのためにネームサービスへの参照を作成します。また、サーバ側で InetAddress.getLocalHost().getHostName()
を使用して、ドット区切り 10 進数とポートの組み合わせではなく、サーバの名前とポートを含んだリモートオブジェクト参照 (つまり IOR) を作成します。
getHostName
の呼び出しを回避するには、次のようなプロパティを設定します (設定方法については、「ネームサービスの起動と停止」を参照)。
com.sun.CORBA.ORBServerHost
にサーバの DNS 名またはドット区切り 10 進数アドレスを設定します。
com.sun.CORBA.ORBInitialHost
に、ネームサーバの DNS 名またはドット区切り 10 進数アドレスを設定します。
注: これらのプロパティは独自のもので、削除または変更されることがあります。
上記の説明では不十分な場合、または上記以外の Sun マイナーコードに遭遇した場合には、http://forum.java.sun.com の開発者フォーラムにメッセージを投稿してください。
マイナーコードの意味について情報を求める場合には、次の情報をお知らせください。
ホーム |