(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 クライアントアプリケーションの例外処理”を参照してください。