ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(イベントサービス編)

4.4.3 例外処理

  プロパティ項目に、サポートされていない項目または誤った項目を設定した場合、呼び出したインタフェースが異常終了し、以下の詳細情報が設定されます。


  

プロパティ項目

詳細情報

補足情報の設定個所

動的生成チャネル

QoS

ユーザ例外 UnsupportedQoS

qos_err

Admin

ユーザ例外 UnsupportedAdmin

admin_err

静的生成チャネル

QoS

ユーザ例外 UnsupportedQoS

qos_err

メッセージ

QoS

システム例外 BAD_QOS


  イベントチャネルに対し、プロパティ項目の設定時にエラーとなった場合、QoSプロパティ項目の場合は、UnsupportedQoS例外のqos_errメンバに、Adminプロパティ項目の場合、UnsupportedAdmin例外のadmin_errメンバに、それぞれ補足情報が設定されます。アプリケーションでは、詳細情報および補足情報を解析することにより、誤ったProperties情報の設定内容を判断できます。
  UnsupportedQoS例外のqos_errメンバ、およびUnsupportedAdmin例外のadmin_errメンバは、PropertyErrorSeq型です。PropertyErrorSeq型は、PropertyError構造体からなるシーケンス型です。
  PropertyError構造体は、codeおよびnameで以下のように形成されています。



  イベントチャネルに対し、プロパティ項目の設定時にエラーとなった場合、以下が設定されます。

PropertyError構造体のname

エラーになったプロパティ項目名

PropertyError構造体のcode

  詳細コード
  設定される詳細コードおよびエラーの意味を以下に示します。たとえば、存在しないQoSプロパティ項目を設定した場合、codeにはBAD_PROPERTYが設定されます。

詳細コード

エラーの意味

UNAVAILABLE_VALUE

指定されたプロパティ項目のうち、設定範囲外の値が設定されていた項目があります。これらの項目は設定されませんでした。

BAD_PROPERTY

不正なプロパティ項目名が指定されました。

BAD_TYPE

プロパティ項目の値のデータ型に誤りがあります。

BAD_VALUE

不正な値が設定されました(create_channelメソッド発行時のみ)。


  静的生成イベントチャネルに対してQoSプロパティ項目の設定時にエラーとなった場合の例外処理方法、および処理の流れを以下に示します。


[プロパティ項目設定時の例外処理の例(C言語の場合)]

      ... 
CosNotifyChannelAdmin_EventChannel_set_qos( channel, pQoS, &env );      /* 1 */
      ... 
if(env._major == CORBA_USER_EXCEPTION)
{                      
      printf("UnsupportedQoS occured.\n"); 
      ErrCodeCheck(&env ); 
      ... 
} 
... 

void
ErrCodeCheck(CORBA_Environment   *env ) 
{
   /* ---- error qos length --------------------------------- */
   int                               length, i; 
   char                              errcode[30]; 
   CosNotification_PropertyErrorSeq  *qos_err;

   qos_err = (CosNotification_PropertyErrorSeq *)                       /* 2 */
             CORBA_exception_value( env );
   length = qos_err->_length;
   printf( "PropertyErrorSeq length=[%d]\n", length );                  /* 3 */

   for( i = 0 ; i < length ; i++ ){
       /* ---- error qos name -------------------------------- */
       printf("err name = [%s]\n",(char*) qos_err->_buffer[i].name );  /* 4 */

       /* ---- error_code ------------------------------------ */
       switch(qos_err->_buffer[i].code ){                              /* 5 */
              case CosNotification_UNSUPPORTED_VALUE:
                      strcpy( errcode, "UNSUPPORTED_VALUE" );
                      break;
              case CosNotification_BAD_PROPERTY:
                      strcpy( errcode, "BAD_PROPERTY" );
                      break;
              case CosNotification_BAD_TYPE:
                      strcpy( errcode, "BAD_TYPE" );
                      break;
           default : 
               strcpy( errcode, "error" ); 
       }
       printf( "err_code = [%s]\n", errcode ); 
   }
   return; 
}

  1. イベントチャネルに対して、QoSプロパティ項目を設定します。

  2. ユーザ例外UnsupportedQoSを受け取ります。

  3. 設定されず、エラーとなったQoSプロパティ項目数を表示します。

  4. 設定されず、エラーとなったQoSプロパティ項目名を表示します。

  5. 詳細コードをチェックします。


[プロパティ項目設定時の例外処理の例(C++言語の場合)]

try{
    ... 
    channel->set_qos( *pQoS, env );                                     /* 1 */
    ... 
} catch( CosNotification::UnsupportedQoS &ue ) {                        /* 2 */
    printf("UnsupportedQoS occured.\n"); 
    ErrCodeCheck( ue ); 
    ... 
} 
... 

void
ErrCodeCheck( CosNotification::UnsupportedQoS ue ) 
{
   /* ---- error qos length --------------------------------- */
   int  length; 
   char errcode[30]; 

   length = ue.qos_err().length();
   printf("PropertyErrorSeq length=[%d]\n", length );                  /* 3 */

   for( int i = 0 ; i < length ; i++ ){
       /* ---- error qos name -------------------------------- */
       printf("err name = [%s]\n",(char*)ue.qos_err()[i]->name );      /* 4 */

       /* ---- error_code ------------------------------------ */
       switch( ue.qos_err()[i]->code ){                                /* 5 */
           case CosNotification::UNAVAILABLE_VALUE: 
               strcpy( errcode, "UNAVAILABLE_VALUE" ); 
               break; 
           case CosNotification::BAD_PROPERTY: 
               strcpy( errcode, "BAD_PROPERTY" ); 
               break; 
           case CosNotification::BAD_TYPE: 
               strcpy( errcode, "BAD_TYPE" ); 
               break; 
           default : 
               strcpy( errcode, "error" ); 
       }
       printf( "err_code = [%s]\n", errcode ); 
   }
   return; 
}

  1. イベントチャネルに対して、QoSプロパティ項目を設定します。

  2. ユーザ例外UnsupportedQoSを受け取ります。

  3. 設定されず、エラーとなったQoSプロパティ項目数を表示します。

  4. 設定されず、エラーとなったQoSプロパティ項目名を表示します。

  5. 詳細コードをチェックします。


[プロパティ項目設定時の例外処理の例(Java言語の場合)]

try{
    ... 
    channel.set_qos(QoS);                                                   /* 1 */
    ... 
} catch(org.omg.CosNotification.UnsupportedQoS e) {                         /* 2 */
    System.out.println("UnsupportedQoS occured."); 
    errCodeCheck(e); 
    ... 
} 
... 

void
errCodeCheck(org.omg.CosNotification.UnsupportedQoS e) 
{
   /* ---- error qos length --------------------------------- */
   String errcode = null; 

   int length = e.qos_err.length;
   System.out.println("PropertyErrorSeq length=[" + length + "]");         /* 3 */

   for( int i = 0 ; i < length ; i++ ){
       /* ---- error qos name -------------------------------- */
       System.out.println("err name = [" + e.qos_err[i].name" + "]");      /* 4 */

       /* ---- error_code ------------------------------------ */
       switch(e.qos_err[i].value){                                         /* 5 */
           case org.omg.CosNotification.QosError_code._UNAVAILABLE_VALUE: 
               errcode = "UNAVAILABLE_VALUE"; 
               break; 
           case org.omg.CosNotification.QosError_code._BAD_PROPERTY: 
               errcode = "BAD_PROPERTY"; 
               break; 
           case org.omg.CosNotification._BAD_TYPE: 
               errcode = "BAD_TYPE"; 
               break; 
           default : 
               errcode = "error"; 
       }
       System.out.println("err_code = [" + errcode + "]"); 
   }
   return; 
}

  1. イベントチャネルに対して、QoSプロパティ項目を設定します。

  2. ユーザ例外UnsupportedQoSを受け取ります。

  3. 設定されず、エラーとなったQoSプロパティ項目数を表示します。

  4. 設定されず、エラーとなったQoSプロパティ項目名を表示します。

  5. 詳細コードをチェックします。


[プロパティ項目設定時の例外処理の例(COBOLの場合)]

WORKING-STORAGE SECTION.
DATA DIVISION.

01 EXCEP USAGE POINTER.
01 TMP-SEQ-POINTER USAGE IS POINTER.
01 TMP-POINTER USAGE IS POINTER.
01 WORK-COUNT PIC  9(09) COMP-5.
01 TMP-STRING-BUF PIC X(64).
01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY STRING-LENGTH.

LINKAGE SECTION.
01 COPY PROPERTYERRORSEQ IN COSEVENTCOMM REPLACING PROPERTYERRORSEQ BY PROPERTYERROR-SEQ.
01 COPY PROPERTYERROR IN COSEVENTCOMM REPLACING PROPERTYERROR BY PROPERTY-ERROR.

PROCEDURE DIVISION.
    ... 
    CALL "COSNOTIFICATION-QOSADMIN-SET-QOS" USING
        EVENT-CHNL
        QOS-PROPERTY
        ENV.                                                                 /* 1 */
    PERFORM SET-QOS-ENV-CHECK.
    ... 

SET-QOS-ENV-CHECK SECTION.
    EVALUATE TRUE
    WHEN CORBA-NO-EXCEPTION OF MAJOR OF ENV
       ... 
    WHEN CORBA-USER-EXCEPTION OF MAJOR OF ENV
         DISPLAY "UnsupportedQoS occured."
         CALL "CORBA-EXCEPTION-VALUE" USING
             ENV
             EXCEP                                                           /* 2 */
         SET ADDRESS OF PROPERTYERROR-SEQ TO EXCEP
         MOVE FUNCTION ADDR( PROPERTYERROR-SEQ ) TO TMP-SEQ-POINTER
         DISPLAY "PropertyErrorSeq length=" SEQ-LENGTH OF PROPERTYERROR-SEQ /* 3 */
         PERFORM VARYING WORK-COUNT FROM 1 BY 1 UNTIL WORK-COUNT > SEQ-LENGTH OF PROPERTYERROR-SEQ
             CALL "CORBA-SEQUENCE-ELEMENT-GET" USING
                 TMP-SEQ-POINTER
                 WORK-COUNT
                 TMP-POINTER
             SET ADDRESS OF PROPERTY-ERROR TO TMP-POINTER
             MOVE FUNCTION LENG( TMP-STRING-BUF ) TO STRING-LENGTH
             CALL "CORBA-STRING-GET" USING
                 NAME OF PROPERTY-ERROR
                 STRING-LENGTH
                 TMP-STRING-BUF
             DISPLAY "err name = " TMP-STRING-BUF                            /* 4 */
             EVALUATE TRUE                                                   /* 5 */
             WHEN COSNOTIFICATION-UNAVAILABLE-VA OF IDL-CODE OF PROPERTY-ERROR
                 DISPLAY "err_code = UNAVAILABLE-VALUE"
             WHEN COSNOTIFICATION-BAD-PROPERTY OF IDL-CODE OF PROPERTY-ERROR
                 DISPLAY "err_code = BAD-PROPERTY"
             WHEN COSNOTIFICATION-BAD-TYPE OF IDL-CODE OF PROPERTY-ERROR
                 DISPLAY "err_code = BAD-TYPE"
             WHEN OTHER
                 DISPLAY "err_code = error"
             END-EVALUATE
         END-PERFORM
         EXIT PROGRAM
    WHEN CORBA-SYSTEM-EXCEPTION OF MAJOR OF ENV
       ... 
    END-EVALUATE.
SET-QOS-ENV-CHECK-END.

  1. イベントチャネルに対して、QoSプロパティ項目を設定します。

  2. ユーザ例外UnsupportedQoSを受け取ります。

  3. 設定されず、エラーとなったQoSプロパティ項目数を表示します。

  4. 設定されず、エラーとなったQoSプロパティ項目名を表示します。

  5. 詳細コードをチェックします。