CORBAには次の2種類の例外があります。OMGで完全に規定された標準システム例外と、アプリケーション・プログラマが定義するユーザー例外です。 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
の値が正しく設定されていますか。 どのように設定するべきかわからない場合は、orbdのマニュアル・ページ(Solaris、Linux、Mac OS XまたはWindows)を参照してください。 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
の呼出しを回避するために、次のようなプロパティを設定できます(設定方法がわからない場合は、orbdのマニュアル・ページ[Solaris、Linux、Mac OS XまたはWindows]を参照)。
com.sun.CORBA.ORBServerHost
にサーバーのDNS名またはドット区切り10進数アドレスを設定します。com.sun.CORBA.ORBInitialHost
に、ネーム・サーバーのDNS名またはドット区切り10進数アドレスを設定します。ノート: これらのプロパティは独自のもので、削除または変更されることがあります。