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

第7章 アプリケーションの開発(COBOL)

7.5 サーバアプリケーションの例外処理

(1)例外情報の設定

 ユーザ例を設定する場合は、CORBA-STRING-SET関数でユーザ例外を識別する文字列を設定する領域を獲得し、この領域に文字列をコピーします。続いて、IDLコンパイラで生成されたALLOC関数でユーザ例外を設定する領域を獲得します。ALLOC関数名はIDLで指定したインタフェース名、例外の識別名およびALLOCをハイフン("-")でつなげた形式で指定します。IDLで定義した例外情報はCOBOLでは構造体となるので、構造体のメンバ変数に値を設定します。最後にCORBA-BOA-SET-EXCEPTION関数でCORBA-ENVIRONMENT構造体に例外情報を設定します。

例外情報の設定例として、下記のIDL定義を使用します。

    module ODdemo{
          interface       calculator{
                  exception ZEROPARAM { long err_code; };
                  struct result {
                          long    add_result;
                          long    subtract_result;
                          long    multiple_result;
                          float   divide_result;
                  };
                  result calculate( in long a, in long b )
                          raises( ZEROPARAM );
          };
    };
例外情報の設定例は以下のようになります。
   IDENTIFICATION DIVISION. 
   PROGRAM-ID. "ODDEMO-CALCULATOR-CALCULATE".
   ENVIRONMENT DIVISION. 
   CONFIGURATION SECTION. 
   SYMBOLIC CONSTANT
   COPY SYMBOL-CONST IN CORBA. 
 
   INPUT-OUTPUT SECTION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
     01 COPY FLOAT IN CORBA    REPLACING CORBA-FLOAT FY FA. 
     01 COPY FLOAT IN CORBA    REPLACING CORBA-FLOAT BY FB. 
     01 ZEROPARAM-P USAGE POINTER. 
     01 COPY EXCEPTION-TYPE IN CORBA REPLACING CORBA-EXCEPTION-TYPE BY FLAGS.
     01 USER-ID USAGE POINTER.
     01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY USER-ID-LENGTH.
     01 EX-ODDEMO-CALCULATOR-ZEROPARAM PIC X(35) VALUE "IDL:ODdemo/calculator/ZEROPARAM:1.0".

   LINKAGE SECTION. 
     01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY A. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY B. 
     01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
     01 COPY FLOAT IN CORBA REPLACING CORBA-FLOAT BY FRET. 
     01 ZEROPARAM-V. 
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY ERROR-CODE.
  *
   PROCEDURE DIVISION USING
           OBJ
           A
           B
           ENV
           FRET. 
  *
   MAIN. 
        MOVE A TO FA. 
        MOVE B TO FB. 
  * エラーZEROPARAMをenvに設定します
        IF B = 0

           SET CORBA-USER-EXCEPTION OF FLAGS TO TRUE

           MOVE FUNCTION LENG (EX-ODDEMO-CALCULATOR-ZEROPARAM) TO USER-ID-LENGTH
           CALL "CORBA-STRING-SET" USING
                 USER-ID
                 USER-ID-LENGTH
                 EX-ODDEMO-CALCULATOR-ZEROPARAM 

           CALL " ODDEMO-CALCULATOR-ZEROPARAM-ALLOC" USING ZEROPARAM-P
           SET ADDRESS OF ZEROPARAM-V TO ZEROPARAM-P
           MOVE 0 TO ERROR-CODE OF ZEROPARAM-V

           CALL "CORBA-BOA-SET-EXCEPTION" USING
                 BOA
                 FLAGS
                 USER-ID
                 ZEROPARAM-P
                 ENV
                 RET
           MOVE 0 TO FRET
           GO TO MAIN-END

        END-IF
        COMPUTE FRET = FA / FB. 
        EXIT PROGRAM. 
   MAIN-END. 
  END PROGRAM  "ODDEMO-CALCULATOR-CALCULATE"

注意事項

 サーバメソッドの引数に渡されるCORBA-ENVIRONMENT構造体を、サーバメソッド内部から他のメソッドを呼び出す場合の引数として使用しないでください。サーバメソッドの例外情報に、他のメソッドで発生したサーバメソッド内部の例外情報が設定されることになります。サーバメソッド内部から他のメソッドを呼び出す場合は、別のCORBA-ENVIRONMENT構造体を使用してください。
 以下に正しいプログラム例、および誤ったプログラム例を示します。

[正しいプログラム例]

   IDENTIFICATION DIVISION. 
   PROGRAM-ID. "ODDEMO-CALCULATOR-CALCULATE". 
   ENVIRONMENT DIVISION. 
   CONFIGURATION SECTION. 
   SYMBOLIC CONSTANT
   COPY SYMBOL-CONST IN CORBA. 
 
   INPUT-OUTPUT SECTION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
     01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ-A. 
     01 COPY COSNAMING-NAMINGCONTEXT IN CORBA REPLACING COSNAMING-NAMINGCONTEXT BY COS-NAMING. 
     01 COPY COSNAMING-NAME          IN CORBA REPLACING COSNAMING-NAM BY NAME. 
     01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY LOCAL-ENV. 

   LINKAGE SECTION. 
     01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY A. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY B. 
     01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
     01 COPY FLOAT IN CORBA REPLACING CORBA-FLOAT BY FRET. 
  *
   PROCEDURE DIVISION USING
           OBJ
           A
           B
           ENV
           FRET. 
  *
   MAIN. 
       :

  *
  *  COSNAMING-NAMINGCONTEXT-BINDの例外情報は、LOCAL_ENVに設定されるため、
  *  ODDEMO-CALCULATOR-CALCULATEの例外情報として扱われることはない
  *
      CALL "COSNAMING-NAMINGCONTEXT-BIND" USING
              COS-NAMING
              NAME
              OBJ-A
              LOCAL-ENV. 
          :

[誤ったプログラム例]

   IDENTIFICATION DIVISION. 
   PROGRAM-ID. "ODDEMO-CALCULATOR-CALCULATE". 
   ENVIRONMENT DIVISION. 
   CONFIGURATION SECTION. 
   SYMBOLIC CONSTANT
   COPY SYMBOL-CONST IN CORBA. 
 
   INPUT-OUTPUT SECTION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
     01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ-A. 
     01 COPY COSNAMING-NAMINGCONTEXT IN CORBA REPLACING COSNAMING-NAMINGCONTEXT BY COS-NAMING. 
     01 COPY COSNAMING-NAME          IN CORBA REPLACING COSNAMING-NAM BY NAME. 

   LINKAGE SECTION. 
     01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY A. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY B. 
     01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
     01 COPY FLOAT IN CORBA REPLACING CORBA-FLOAT BY FRET. 
  *
   PROCEDURE DIVISION USING
           OBJ
           A
           B
           ENV
           FRET. 
  *
   MAIN. 
       :
      
  *
  * COSNAMING-NAMINGCONTEXT-BINDが例外復帰した場合、COSNAMING-NAMINGCONTEXT-BIND
  * の例外情報がODDEMO-CALCULATOR-CALCULATEの例外情報として扱われてしまう
  *
      CALL "COSNAMING-NAMINGCONTEXT-BIND" USING
              COS-NAMING
              NAME
              OBJ-A
              ENV. 
      :

(2)例外情報の獲得

 サーバアプリケーションで例外を獲得する方法は、クライアントアプリケーションの例外処理と同様です。詳細については、“クライアントアプリケーションの例外処理”を参照してください。


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

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