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進数アドレスを設定します。注: これらのプロパティは独自のもので、削除または変更されることがあります。
上記の説明では不十分な場合、または上記以外のSunマイナー・コードに遭遇した場合には、Oracle Forum Homeの開発者フォーラムにメッセージを投稿してください。
マイナー・コードの意味について情報を求める場合には、次の情報をお知らせください。