Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第6章 アプリケーションの開発(Java言語)

6.6 クライアントアプリケーションの例外処理

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

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005