3.2.4 例外処理のコーディング
ここでは,サービスルーチンで検知するJava例外とサービスルーチンで検知しないJava例外について説明します。
(1) サービスルーチンで検知するJava例外の処理
次のサービスルーチンでは,Javaプログラムから例外がスローされたことで,サービスルーチンの呼び出しが失敗で終了することがあります。
-
CBLJSTATICINVOKEサービスルーチン
-
CBLJNEWサービスルーチン
-
CBLJINVOKEサービスルーチン
Javaプログラムから例外がスローされた場合,CBLJENV集団項目のCBLJEXCEPTION項目にスローされた例外オブジェクトを設定し,RETURN-CODE特殊レジスタに1を返します。
RETURN-CODE特殊レジスタが0でない場合は,CBLJEXCEPTION項目の例外オブジェクトを使って例外処理をしてください。
インスタンスメソッドを呼び出す例について説明します。
COMPUTE ARGPTR(1) = FUNCTION ADDR( ARG-STRING ). COMPUTE ARGPTR(2) = ZERO. CALL 'CBLJINVOKE' USING CBLJENV OBJREF SampleMethod ARG-LIST RTN-INT. IF RETURN-CODE NOT = 0 *> CBLJEXCEPTIONを使った例外処理をここに記述する。 CALL 'CBLJFINALIZE' USING CBLJENV *> ※1 MOVE nnnn TO ABN-CODE CALL 'CBLABN' USING ABN-CODE *> ※2 END-IF. |
- 注※1
-
Javaプログラム呼び出し機能の実行環境の終了処理の呼び出しを示します。
- 注※2
-
COBOLプログラムを異常終了(終了コードはnnnn)させるサービスルーチンの呼び出しを示します。
CBLJEXCEPTIONを使った例外処理では,CBLJEXCEPTION項目を使って例外オブジェクトの種別判定や例外オブジェクトのメソッド呼び出しまたはフィールドアクセスを実行します。
この例では※1,※2の呼び出しによってCOBOLプログラムを終了していますが,続行できる例外ならば続行させてもかまいません。
なお,例外処理中にメソッドを呼び出す場合は,CBLJCOPYサービスルーチンを使って,CBLJEXCEPTION項目の例外オブジェクトのオブジェクト参照を退避してください。メソッド呼び出しのサービスルーチンは,CBLJEXCEPTION項目を更新します。
01 EXP-OBJ USAGE POINTER. 01 EXP-CLS USAGE POINTER VALUE NULL. 01 EXP-TOSTRING PIC X DYNAMIC C-STRING VALUE 'toString'. 01 EXP-STRING. 02 EXP-STR-TYPE PIC X(256) VALUE 'Ljava/lang/String;'. 02 EXP-STR-AREA USAGE POINTER. *> 例外オブジェクトのメソッドtoString()を呼び出して *> 情報を取得する CALL 'CBLJCOPY' USING CBLJENV CBLJEXCEPTION EXP-OBJ EXP-CLS. CALL 'CBLJINVOKE' USING CBLJENV EXP-OBJ EXP-TOSTRING NO-ARG EXP-STRING. |
CBLJEXCEPTION項目を使って発生した例外オブジェクトの種別を判定する例を次に示します。
-
発生した例外が,ある特定のクラスまたはそのサブクラスであるかの判定
01 MyException PIC X DYNAMIC C-STRING VALUE 'MyException'. 01 MY-EXCEPTION USAGE POINTER. CALL 'CBLJGETCLASS' USING CBLJENV MyException MY-EXCEPTION CALL 'CBLJINSTANCEOF' USING CBLJENV CBLJEXCEPTION MY-EXCEPTION IF RETURN-CODE NOT = 0 *> MyException例外の処理をここに記述する。 END-IF
-
発生した例外が,ある特定のクラスであるかの判定
01 EXCEPTNAME-LEN PIC 9(9) USAGE COMP VALUE 256. 01 EXCEPTNAME PIC X(256). CALL 'CBLJCLASSNAME' USING CBLJENV CBLJEXCEPTION EXCEPTNAME EXCEPTNAME-LEN EVALUATE EXCEPTNAME WHEN '例外クラス名1' *> 例外クラス名1の処理をここに記述する。 WHEN '例外クラス名2' *> 例外クラス名2の処理をここに記述する。 WHEN '例外クラス名3' *> 例外クラス名3の処理をここに記述する。 WHEN OTHER *> その他の例外の処理をここに記述する。 END-EVALUATE
- 注意事項
-
CBLJCLASSNAMEサービスルーチンが返す名前は,Javaプログラム呼び出し機能のクラス名(パッケージとクラス名をスラントで区切る)ではなく,Javaのクラス名(パッケージとクラス名をピリオドで区切る)です。
例)
java.lang.Exception
(2) サービスルーチンで検知しないJava例外
サービスルーチンで検知しないJava例外の場合,Javaプログラムで例外が発生したとき,COBOLプログラムのスレッドまたはプロセスが終了します。
この場合の対処については,「5 プログラムのデバッグとトラブルシュート」を参照してください。