ページの先頭行へ戻る
Interstage Application Server V13.0.0 アプリケーション作成ガイド(CORBAサービス編)
FUJITSU Software

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

(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)例外情報の獲得

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