クライアントアプリケーションは、サーバアプリケーションの処理結果が正常終了か異常終了かを知ることができます。また、異常終了した場合は、システムの異常終了か、サーバアプリケーションの異常終了かを知ることができます。前者をシステム例外、後者をユーザ例外と呼びます。システム例外クラスを以下の表に示します。
システム例外は、親クラスとしてorg.omg.CORBA.SystemExceptionが定義され、その継承クラスとして各詳細情報を定義したクラスorg.omg.CORBA.UNKNOWN、org.omg.CORBA.BAD_PARAMなどがあります。ユーザ例外は、親クラスとしてorg.omg.CORBA.UserExceptionが定義されます。例外の意味については、“メッセージ集”の“CORBAサービスから通知される例外情報/マイナーコード”を参照してください。
例外情報 | 例外クラス |
|---|---|
BAD_CONTEXT | org.omg.CORBA.BAD_CONTEXT |
BAD_INV_ORDER | org.omg.CORBA.BAD_INV_ORDER |
BAD_OPERATION | org.omg.CORBA.BAD_OPERATION |
BAD_PARAM | org.omg.CORBA.BAD_PARAM |
BAD_QOS | org.omg.CORBA.BAD_QOS |
BAD_TYPECODE | org.omg.CORBA.BAD_TYPECODE |
CODESET_INCOMPATIBLE | org.omg.CORBA.CODESET_INCOMPATIBLE |
COMM_FAILURE | org.omg.CORBA.COMM_FAILURE |
DATA_CONVERSION | org.omg.CORBA.DATA_CONVERSION |
FREE_MEM | org.omg.CORBA.FREE_MEM |
IMP_LIMIT | org.omg.CORBA.IMP_LIMIT |
INITIALIZE | org.omg.CORBA.INITIALIZE |
INTERNAL | org.omg.CORBA.INTERNAL |
INTF_REPOS | org.omg.CORBA.INTF_REPOS |
INV_FLAG | org.omg.CORBA.INV_FLAG |
INV_IDENT | org.omg.CORBA.INV_IDENT |
INV_OBJREF | org.omg.CORBA.INV_OBJREF |
INV_POLICY | org.omg.CORBA.INV_POLICY |
MARSHAL | org.omg.CORBA.MARSHAL |
NO_IMPLEMENT | org.omg.CORBA.NO_IMPLEMENT |
NO_MEMORY | org.omg.CORBA.NO_MEMORY |
NO_PERMISSION | org.omg.CORBA.NO_PERMISSION |
NO_RESOURCES | org.omg.CORBA.NO_RESOURCES |
NO_RESPONSE | org.omg.CORBA.NO_RESPONSE |
OBJ_ADAPTER | org.omg.CORBA.OBJ_ADAPTER |
PERSIST_STORE | org.omg.CORBA.PERSIST_STORE |
REBIND | org.omg.CORBA.REBIND |
TIMEOUT | org.omg.CORBA.TIMEOUT |
TRANSIENT | org.omg.CORBA.TRANSIENT |
UNKNOWN | org.omg.CORBA.UNKNOWN |
INVALID_TRANSACTION | org.omg.CORBA.INVALID_TRANSACTION |
TRANSACTION_MODE | org.omg.CORBA.TRANSACTION_MODE |
TRANSACTION_REQUIRED | org.omg.CORBA.TRANSACTION_REQUIRED |
TRANSACTION_ROLLEDBACK | org.omg.CORBA.TRANSACTION_ROLLEDBACK |
TRANSACTION_UNAVAILABLE | org.omg.CORBA.TRANSACTION_UNAVAILABLE |
tryブロックで例外をハンドルするために例外クラスに対応するcatchブロックを定義します。例外が発生すると、例外クラスに対応するcatchブロックが実行されます。
詳細エラーごとにエラー処理を記述したい場合は、以下のように詳細エラーごとにcatch文で指定します。共通なエラー処理は、システム例外の場合、org.omg.CORBA.SystemExceptionクラスをcatch文で利用すれば、それ以前のcatchで指定されている詳細エラー以外のすべてのエラー情報を一括して受けることができます。もし、システム例外、ユーザ例外、各例外のエラー処理の区別が必要でない場合、上位クラスであるjava.lang.Exceptionをcatch文で指定すれば、すべて一括して受けることができます。
また、システム例外発生時は、org.omg.CORBA.SystemException.minorを使用してマイナーコードを獲得することができます。マイナーコードの値については、“メッセージ集”の“CORBAサービスから通知される例外情報/マイナーコード”を参照してください。
try {
fret =target.divide( inArg1,inArg2 );
// divideメソッドを実行
}
catch( org.omg.CORBA.UNKNOWN e ){
// org.omg.CORBA.UNKNOWNの場合の処理
System.out.println("ERROR : " + e.getClass().getName()
+ ": Minor = 0x" + java.lang.Integer.toHexString(e.minor)); // マイナーコードの獲得
}
catch( org.omg.CORBA.BAD_PARAM e ){
// org.omg.CORBA.BAD_PARAMの場合の処理
System.out.println("ERROR : " + e.getClass().getName()
+ ": Minor = 0x" + java.lang.Integer.toHexString(e.minor)); // マイナーコードの獲得
}
catch( org.omg.CORBA.SystemException e ){
System.out.println("ERROR : " + e.getClass().getName()
+ ": Minor = 0x" + java.lang.Integer.toHexString(e.minor)); // マイナーコードの獲得
// 上記以外のシステム例外
}
catch( demo.calc.ZERODIVIDE e ){
// ユーザ例外の処理
}または
try {
fret =target.divide( inArg1, inArg2 ); // divideメソッドを実行
}
catch( java.lang.Exception e ){
if ( e instanceof demo.calc.ZERODIVIDE ){
// ユーザ例外の処理
}
if ( e instanceof org.omg.CORBA.SystemException ){
// システム例外の処理
System.out.println("ERROR : " + e.getClass().getName()
+ ": Minor = 0x" // マイナーコードの獲得
+ java.lang.Integer.toHexString(((org.omg.CORBA.SystemException)e).minor));
:
}
// その他の例外の処理など
}IDL言語でユーザ例外が定義されていた場合のクライアントアプリケーションプログラムの例を以下に示します。
(1)IDLマッピング
【IDL言語】
module ODsample {
interface exptest{
exception testException { string reason; };
void op1() raises( testException );
};
};これをJava言語で記述すると、以下のようになります。
【Java言語】
<インタフェース>
package ODsample;
public interface exptest extends org.omg.CORBA.Object {
public void op1() throws ODsample.exptestPackage.testException;
}<ユーザ例外クラス>
package ODsample.exptestPackage;
public class testException extends org.omg.CORBA.UserException {
public java.lang.String reason;
public testException() {
reason = null;
}
public testException( java.lang.String _reason ) {
reason = _reason;
}
}(2)クライアントアプリケーションでの処理
import org.omg.CORBA.*;
import ODsample.*;
public class expClient {
public static void main( String args[] ) {
// ORBの前処理
// オブジェクトリファレンスの獲得
:
try {
// サーバアプリケーションのメソッド呼出し
target.op1( );
}
catch ( ODsample.exptestPackage.testException e ) {
System.out.println( "UserException : " );
System.out.println( " " + e + " -> " + e.reason );
}
catch (java.lang.Exception e) {
if ( e instanceof demo.calc.ZERODIVIDE ){
// ユーザ例外の処理
}
if ( e instanceof org.omg.CORBA.SystemException )
// システム例外の処理
System.out.println("ERROR : " + e.getClass().getName()
+ ": Minor = 0x" // マイナーコードの獲得
+ java.lang.Integer.toHexString(((org.omg.CORBA.SystemException)e).minor));
:
}
}
}
}