ON

目的

プログラムの実行中に特定の条件が発生した際に実行するアクションを識別します。

構文

ON condition-name ON-unit;

または

ON condition-name SYSTEM;

パラメーター

condition-name
ANYCONDITION、AREA、ATTENTION、CONDITION(name)、CONVERSION、ENDFILE(f)、ENDPAGE(f)、ERROR、FINISH、FIXEDOVERFLOW、KEY(f)、RECORD(f)、OVERFLOW、SIZE、STRINGRANGE、UNDEFINEDFILE(f)、USERCONDITION (expression)、USERCONDITION(SS$_UNWIND)、VAXCONDITION (expression)、または ZERODIVIDE。

各パラメーターの詳細については、「Open PL/I の条件」または下記の「説明」セクションの最後にあるリストを参照してください。

ON-unit
BEGIN ブロックまたは PROCEDURE、DO、END、DECLARE、FORMAT、あるいは RETURN 以外の文 (CALL RESIGNAL 文が含まれる場合があります)。

説明

ON 文は、プログラムの実行中に特定の条件が通知された際に実行するアクションを識別します。

ON 文は実行可能な文であり、指定された条件を通知する文の前に実行する必要があります。

ON 文の実行により、条件が通知された際に呼び出されるプロシージャのように ON-unit が確立されます。ON-unit は実行されません。

この条件の ON-unit が現在のブロックの有効化中にすでに確立されている場合は、この ON-unit に置き換えられます。

実行中、ON-unit は次のいずれかを実行できます。

  • 条件を処理し、条件が通知されたポイントに制御を戻します。
  • 条件を再通知し、条件を処理する別の ON-unit を見つけるように Open PL/I に指示します。
  • ローカル以外の GOTO 文を実行します。これにより、Open PL/I で呼び出しスタックがアンワインドされます。
  • プログラムを終了します。

ON-unit を呼び出す条件がランタイムまたはデバッガーで検出された場合に通知を受け取ることができるため、プログラムの状態を調査し、必要に応じてブレークポイントを設定できます。詳細については、「ON-unit 通知によるプログラムの状態の確認」を参照してください。

ON-unit は、置き換えられるまで、REVERT 文で元に戻されるまで、またはそれが確立されたブロックの有効化が終了するまで、確立されたままになります。

条件が通知されると、現在のブロックの有効化から、各ブロックの有効化が調査され、その条件に対して確立された ON-unit があるかどうかが確認されます。ない場合は、その条件に対する ON-unit が見つかるまで、前のブロックの有効化が調査されます。ON-unit が存在しない場合は、デフォルトの ON-unit が呼び出されます。ENDFILE のデフォルトの ON-unit は ERROR 条件を通知します。ENDPAGE のデフォルトの ON-unit は新しいページを配置します。つまり、PUT PAGE 文を実行することと同じです。FINISH のデフォルトの ON-unit は、信号が発生した場所に続くプログラム内のポイントに制御を戻します。他のすべての条件に対するデフォルトの ON-unit は、ERROR 条件を通知します。これにより、ERROR の ON-unit でエラーが処理されない場合にはエラー診断が表示されてプログラムが停止します。

このメカニズムの結果として、ブロックでは、条件に対して独自の ON-unit を確立することも、その呼び出し元の ON-unit にその条件を処理させることもあります。ブロックによって確立された ON-unit は、ブロックがその呼び出し元に制御を戻す際に元に戻されるか、そうでなければ終了されます。

信号により、ON-unit は、パラメーターのないプロシージャのように呼び出されます。ON-unit が GOTO を実行するか、その END 文を実行すると、この呼び出しによるブロックの有効化が終了します。後者の場合、制御は信号の発信元に戻されます。

ON-unit 内で GOTO が実行されて ON-unit から制御が移されると、ON-unit のブロックの有効化、および制御の移動先となるブロックの有効化 (それ自体は含まない) までのすべてのブロックの有効化が終了します。

ON 条件の ENDFILE、ENDPAGE、KEY、および UNDEFINEDFILE は、ファイル制御ブロックごとに一意に確立され、常に、ファイル値を識別する参照 f を使用して書き込まれます。このように参照される条件は、f に関連付けられたファイル制御ブロックによって修飾されます。したがって、ENDFILE(g) および ENDFILE(h) については、g および h が異なるファイル制御ブロックを識別する場合は異なる条件になりますが、g および h が同じファイル制御ブロックを識別する場合は同じ条件になります。

これらの条件が通知される直前に、ONFILE 組み込み関数の値は、条件が通知されているファイル制御ブロックのファイル ID に設定されます。ON-unit にラベル プレフィックスを付けることはできません。

別途指定がない限り、次の条件に対するデフォルトの ON-unit は、ERROR 条件を通知します。これにより、エラーがキャッチされない場合にはメッセージが出力されてプログラムの実行が終了します。

SYSTEM キーワードは、ON-unit のコードを実行する代わりに、条件を説明するメッセージが出力されて ERROR 条件が発生することを示します。

ON 条件の SYSTEM 文は、ERROR ON-unit で ERROR 条件が発生した場合などに例外ハンドラー内の無限ループを防止する際に役立つことがあります。

ON ERROR BEGIN;
        ON ERROR SYSTEM;
.
.
.
END;

上の例では、ON ERROR SYSTEM 文に続くコードでエラー例外が発生した場合、エラー状態を説明するメッセージの出力後にプログラムが終了します。

ほとんどの ON 条件については、本ドキュメントの「Open PL/I の条件」セクションで詳しく説明されています。

さらに、次の条件があります。

  • USERCONDITION (expression)

    USERCONDITION (expression) ON-unit は、整数に評価される expression で指定された条件を処理します。この ON-unit は、式の値と一致する SIGNAL USERCONDITION 文の実行に応答して呼び出されます。詳細については、「SIGNAL 文」を参照してください。

    USERCONDITION 条件は、SIGNAL 文を使用して通知されることがあります。USERCONDITION として指定された式の値は、条件の通知時ではなく、ON 文の実行時に決定されます。「Open PL/I ユーザー ガイド」に記載されている数値の範囲は、システム使用のために割り当てられます。

  • USERCONDITION (SS$_UNWIND)

    USERCONDITION (SS$_UNWIND) ON-unit は、UNWIND 条件によって通知される条件を処理します。UNWIND 条件は、ローカル以外の GOTO によって前のブロックから実行が進むように強制されて、呼び出しスタックからフレームが削除される際に発生します。

    これは USERCONDITION (expression) の特殊なケースです。名前 SS$_UNWIND は、GLOBALREF として使用可能であり、そのように宣言する必要があります。

  • VAXCONDITION (expression)

    VAXCONDITION (expression) ON-unit は、USERCONDITION (expression) ON-unit と同意であり、プログラム変換を容易にするために用意されています。一方の ON-unit を使用して、いずれの SIGNAL もキャッチできます。

制約事項

なし。