Rational Developer for System z
Enterprise COBOL for z/OS バージョン 4.1 プログラミング・ガイド


XML PARSE の例外処理

パーサーは、構文解析中に異常またはエラーを検出すると、例外コードを XML-CODE 特殊レジスターに設定します。 特定の例外コードおよびそれに続いて実行できるアクションは、XMLPARSE コンパイラー・オプションの設定によって異なります。

XMLPARSE(XMLSS) の場合

パーサーが XML-CODE 特殊レジスターで返す例外コードは、z/OS XML System Services パーサーが生成する戻りコードと理由コードで構成されます。 戻りコードと理由コードはそれぞれハーフワード・バイナリー値です。 XML-CODE の値はこれらの 2 つの値を連結したものです。 たとえば、次の XML 文書は、エレメント終了タグ mmsg がエレメント開始タグ msg と一致していないため、正しい構成ではありません。

<msg>Hello</mmsg>

この文書の z/OS XML System Services パーサーからの戻りコードは、12 (16 進数の 000C) です。 理由コードは、16 進数の 3035 (XRSN_ENDTAG_NAME_MISMATCH) です。 この 2 つの値を連結した 16 進数の 000C3035 が、特殊レジスター XML-CODE で、処理プロシージャーに返されます。

パーサーの戻りコードおよび理由コードは、「z/OS XML System Services Users Guide and Reference」の付録で 16 進値で文書化されています。

処理プロシージャーでは、例外イベントを処理できず、構文解析を再開できません。 処理プロシージャーが EXCEPTION イベントからパーサーに戻るとき、パーサーはイベントをそれ以上シグナル通知しません。 パーサーは、XML PARSE ステートメントの ON EXCEPTION 句で指定したステートメントに制御を渡します。 ON EXCEPTION 句がコーディングされていない場合、制御は XML PARSE ステートメントの終わりに移動します。XML-CODE には、パーサーが設定した元の例外コードが含まれます。

XMLPARSE(COMPAT) の場合

XML パーサーが XML-CODE に入れて渡す例外コードが特定範囲内にある場合、処理プロシージャーで例外イベントを処理して構文解析を再開できます。

処理プロシージャーで例外イベントを処理するには、次の手順に従います。

  1. XML-CODE の内容を検査します。
  2. 必要に応じて例外を処理します。
  3. XML-CODE を、例外が処理されたことを示すゼロに設定します。
  4. パーサーに制御を戻します。これにより、例外条件がなくなります。

このような方法で例外を処理できるのは、XML-CODE に入れて渡される例外コードが以下の範囲の 1 つに含まれる場合 (エンコードの矛盾が検出されたことを示します) のみです。

XML-CODE に渡される 例外コードが 1 から 49 の範囲内にある例外に対して、限られた例外処理を行うことができます。この範囲内の例外が発生した後、パーサーは、戻る前に XML-CODE がゼロに設定されている場合でも、END-OF-DOCUMENT イベントを除き、それ以上標準イベントをシグナル通知しません。XML-CODE をゼロに設定した場合、パーサーは文書の構文解析を続行し、検出した例外をシグナル通知します (これは、文書内で複数のエラーを発見する方法として有効です。)

この範囲の例外発生後の構文解析の終了時に、ON EXCEPTION 句に指定されたステートメントがあればこれに制御が渡され、そうでなければ、XML PARSE ステートメントの終わりに制御が渡されます。特殊レジスター XML-CODE には、パーサーが設定した最新の例外のコードが格納されます。

この他の例外では、パーサーは追加のイベントをシグナル通知せず、ON EXCEPTION 句に指定されているステートメントに制御を渡します。 この場合、パーサーに制御を返す前に処理プロシージャーで XML-CODE を初期化したとしても、XML-CODE には元の例外番号が入ります。

例外を処理する必要がない場合は、XML-CODE の値を変更しないでパーサーに制御を戻します。パーサーは、ON EXCEPTION 句で指定されたステートメントに制御権を移動します。ON EXCEPTION 句がコーディングされていない場合、制御は XML PARSE ステートメントの終わりに移動します。

構文解析の終了時点までに未処理の例外がなかった場合は、NOT ON EXCEPTION 句に指定されたステートメントに制御が渡されます (構文解析の正常終了)。NOT ON EXCEPTION 句をコーディングしなかった場合、制御は XML PARSE ステートメントの終わりに渡されます。特殊レジスター XML-CODE はゼロに設定されます。


ご利用条件 | フィードバック

このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)