CORBA には次の 2 種類の例外があります。OMG で完全に規定された標準システム例外と、アプリケーションプログラマが定義するユーザー例外の 2 つです。CORBA の例外は Java の例外オブジェクトとは多少異なりますが、その違いの大部分は IDL から Java へのマッピング時に解決されます。
ここでは、次の項目について説明します。
IDL で例外を指定するには、インタフェースの設計者はキーワード raises を使用します。これは、Java で throws を指定するのと同様です。IDL でこの例外キーワードを使用する場合は、ユーザー定義例外を作成することになります。標準システム例外では、このような指定をする必要はなく、また、このような指定をすることはできません。
システム例外は、呼び出されたすべての 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) のリストについては、Object Management Group の Web サイトを参照してください。
よく遭遇する 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 マイナーコードに遭遇した場合には、Oracle Forum Home の開発者フォーラムにメッセージを投稿してください。
マイナーコードの意味について情報を求める場合には、次の情報をお知らせください。