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

第4章 アプリケーションの開発(各機能)> 4.1 イベントチャネル接続のアプリケーション開発> 4.1.1 ノーティフィケーションサービスのQoS機能の運用

4.1.1.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にエラーになったプロパティ項目名が設定され、codeに詳細コードが設定されます。設定される詳細コードとエラーの意味を以下に示します。

詳細コード

エラーの意味

UNAVAILABLE_VALUE

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

BAD_PROPERTY

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

BAD_TYPE

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

BAD_VALUE

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

 例えば、存在しないQoSプロパティ項目を設定した場合、codeにはBAD_PROPERTYが設定されます。

 静的生成イベントチャネルに対して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. 詳細コードをチェックします。

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

Copyright 2008 FUJITSU LIMITED