MONITOR (監視グループの始め)

自由形式構文 MONITOR
コード 演算項目 1 演算項目 2 結果フィールド 標識
MONITOR            
MONITOR グループは、状況コードに基づいて、条件付きエラー処理を実行します。グループは次のものから構成されます。
  • MONITOR ステートメント
  • 1 つまたは複数の ON-ERROR グループ
  • 1 つの ENDMON ステートメント

MONITOR ステートメントの後は、制御は次のステートメントに渡されます。 MONITOR ブロックは、MONITOR ステートメントから最初の ON-ERROR ステートメントまでのすべてのステートメントで構成されます。MONITOR ブロックの処理の際にエラーが発生すると、適切な ON-ERROR グループに制御が渡ります。

MONITOR ブロックのすべてのステートメントがエラーなしに処理された場合は、 ENDMON ステートメントの次のステートメントへ制御が渡されます。

MONITOR グループは演算の中の任意の場所に指定することができます。 IF、DO、SELECT、または他の MONITOR グループの中でネストすることもできます。 IF、DO、および SELECT グループは、MONITOR グループの中でネストすることができます。

MONITOR グループが別の MONITOR グループの中でネストされている場合、エラーが起こると、最も深いグループが最初に考慮されます。 その MONITOR グループがそのエラー条件を処理しない場合は、次のグループが考慮されます。

MONITOR 命令ではレベル標識が使用され、MONITOR グループが合計演算の一部であることを示します。文書化を目的としてレベル標識を ON-ERROR または ENDMON 命令に指定することもできますが、このレベル標識は無視されることになります。

MONITOR ステートメントでは、条件付け標識を使用することができます。 条件付け標識が満たされない場合には、MONITOR グループの ENDMON 命令の後のステートメントに即時に制御が渡されます。ON-ERROR 命令に単独で条件付け標識を使用することはできません。

MONITOR ブロックがサブプロシージャーの呼び出しを含んでおり、かつそのサブプロシージャーにエラーがある場合は、そのサブプロシージャーのエラー処理が優先順位を有します。 例えば、サブプロシージャーに *PSSR サブルーチンがあれば呼び出されます。呼び出しを含む MONITOR グループは、サブプロシージャーがエラー処理に失敗し、00202 の「呼び出し中のエラー」 状況で呼び出しが失敗した場合にのみ、考慮されることになります。

MONITOR グループはサブルーチンで発生したエラーを処理します。サブルーチンが自分自身の MONITOR グループを持っている場合は、それらが最初に考慮されます。

MONITOR ブロックの中での分岐命令は許されませんが、ON-ERROR ブロックの中であれば許されます。

MONITOR ブロックの中での LEAVE 命令または ITER 命令は、その MONITOR ブロックを含んでいるすべての活動状態の DO グループに対して適用されます。MONITOR ブロックの中での LEAVESR 命令または RETURN 命令は、その MONITOR ブロックを含んでいるすべてのサブルーチン、サブプロシージャー、またはプロシージャーに対して適用されます。

詳細については、エラー処理命令を参照してください。

図 1. MONITOR 命令
 * MONITOR ブロックは、READ ステートメントと IF グループで
 * 構成されています。
 * - 最初の ON-ERROR ブロックは、ファイルがオープンされていない
 *   場合に READ 命令に対して出される状況 1211 を処理します。
 * - 2 番目の ON-ERROR ブロックは、その他のすべてのファイル・エラーを処理します。
 * - 3 番目の ON-ERROR ブロックは、ストリング命令状況コード 00100
 *   および配列指標状況コード 00121 を処理します。
 * - 4 番目の ON-ERROR ブロック (演算項目 2 が *ALL) は、
 *   指定された ON-ERROR 命令では処理されないエラーを
 *
 *
 * MONITOR ブロックでエラーが発生しない場合は、制御は
 * ENDIF から ENDMON に渡されます。
C                  MONITOR
C                  READ       FILE1
C                  IF         NOT %EOF
C                  EVAL       Line = %SUBST(Line(i) :
C                                           %SCAN('***': Line(i)) + 1)
C                  ENDIF
C                  ON-ERROR   1211
C                   ... file-not-open の処理
C                  ON-ERROR   *FILE
C                   ... その他のファイル・エラーの処理
C                  ON-ERROR   00100 : 00121
C                   ... ストリング・エラーおよび配列指標エラーの処理
C                  ON-ERROR
C                   ... その他のすべてのエラーの処理
C                  ENDMON