パーサーは、構文解析中に異常またはエラーを検出すると、例外コードを 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 に入れて渡す例外コードが特定範囲内にある場合、処理プロシージャーで例外イベントを処理して構文解析を再開できます。
処理プロシージャーで例外イベントを処理するには、次の手順に従います。
このような方法で例外を処理できるのは、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 はゼロに設定されます。