クライアントアプリケーションは、サーバアプリケーションの処理結果が正常終了か異常終了かを知ることができます。また、異常終了した場合には、システムの異常終了か、サーバアプリケーションの異常終了かを知ることができます。前者をシステム例外、後者をユーザ例外と呼びます。システム例外クラスを以下の表に示します。
システム例外は、親クラスとして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)); : } } } }