Java 例外の処理

制約事項: 次の説明はネイティブ コードのみに該当します。

Java からスローされた例外は、javaexpt クラスに発生したオブジェクト指向 COBOL の例外として、COBOL に返されます。デフォルトでは、COBOL ランタイム システムは例外を受信すると、その旨を警告するメッセージを表示して終了します。あるいは、COBOL プログラムにイベント ハンドラーを追加して、例外をトラップすることも可能です。

Java 例外をトラップする手順は次のとおりです。

  1. クラス制御段落で、Exceptionmanager、JavaExceptionManager、および Callback (または EntryCallback) の各クラスを宣言します。次に例を示します。
    repository.
        ...
        class JavaExceptionManager as "javaexpt"
        class ExceptionManager as "exptnmgr"
        class Callback as "callback"
        class EntryCallback as "entrycll"
        ...
    ヒント: 例外処理クラス メソッドまたはエントリ ポイントを宣言した場合、上記のデフォルト Micro Focus 例外処理メソッドのいずれかと名前を共有すると、デフォルト メソッドは呼び出せない点に注意してください。
  2. 例外ハンドラー (クラスのメソッドまたはエントリ ポイント) を作成した後に、対応する Callback または EntryCallback のコードを記述します。たとえば、Callback の場合、次のように記述します。
    invoke Callback "new" using anObject z"methodName"
                      returning aHandler

    EntryCallback の場合、次のように記述します。

    invoke EntryCallback "new" using  z"entryPointname"
                      returning aHandler
  3. コールバックを JavaExceptionManger クラスに登録します。次に例を示します。
    invoke ExceptionManager "register"
             using JavaExceptionManager aHandler

以上の手順を実施すると、オブジェクト指向 COBOL の Java ドメインを経由して呼び出している、Java クラスからスローされた Java 例外が、作成した例外ハンドラーに常に送信されるようになります。

Java プログラムからスローされた例外をキャッチする COBOL プログラムの例を次に示します。

$set ooctrl (+p-f)
 program-id. ExceptionCatcher.

 class-control.
     SimpleClass is class "$JAVA$SimpleClass"
     EntryCallback is class "entrycll"
     JavaExceptionManager is class "javaexpt"
     ExceptionManager is class "exptnmgr"
     .

 working-storage section.
 01 theInstance                  object reference.
 01 wsCallback                   object reference.
 local-storage section.
 01 filler pic x.   *> dummy storage to allow the local entry
                    *> point to be used for the callback
 linkage section.
 01 lnkException                 object reference.

 procedure division.
*>---Set up Exception handler
     invoke EntryCallback "new" using z"JException"
                            returning wsCallback
     invoke ExceptionManager "register"
                                  using javaexceptionmanager
                                        wsCallback
*>---Instantiate the class
     invoke SimpleClass "new" returning theInstance

     display "instantiated"
     invoke theInstance "TestException"
     display "excepted"
     stop run.


 entry "Jexception" using lnkException.
     invoke lnkException "display"
     .

このプログラムでは局所記憶節によって再帰呼び出しが可能になっており、COBOL ランタイム システムが EntryCallback を再帰的に呼び出します。局所記憶節がないと、ランタイム システム エラーの原因となります。呼び出される SimpleClass の Java コードは次のとおりです。

import java.lang.* ;

public class SimpleClass {

  public SimpleClass() {
  }

  public void TestException() throws Exception
  {
     Exception e = new Exception ("Test error" );
     throw e;
  }
}

具体的な cobinvoke_ 関数の種類は、COBOL 開発システム インストールの help\mfcobol.docs.zip (Windows) or docs/mfcobol.docs.zip (UNIX) にある「Java Run-time Class Library Reference」を参照してください。