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)、OVERFLOW、RECORD(f)、SIZE、UNDEFINEDFILE(f)、UNDERFLOW、USERCONDITION (expression)、USERCONDITION(SS$_UNWIND)、VAXCONDITION (expression)、または ZERODIVIDE
ON-unit
BEGIN ブロックまたは PROCEDURE、DO、END、DECLARE、FORMAT、あるいは RETURN 以外の文 (CALL RESIGNAL 文が含まれる場合があります)。
注:

省略形:

  • ATTENTION は ATTN
  • CONDITION は COND
  • CONVERSION は CONV
  • OVERFLOW は OFL
  • UNDERFLOW は UFL
  • UNDEFINEDFILE は UNDF
  • ZERODIVIDE は ZDIV

説明

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 条件は次のように記述されます。

  • ANYCONDITION

    ANYCONDITION ON-unit は、他の ON-unit では処理できない信号状態を処理します。ANYCONDITION ON-unit は、ブロック内で確立された他のすべての ON-unit が調査され、信号状態と一致しないことが確認された後に実行されます。

  • AREA

    AREA 条件は、格納用の空き記憶域が不足している領域内で基底付き変数を割り当てようとしたときに発生します。AREA 条件 (基底付き領域用など) の ON-unit は、割り当てが再試行される別の領域をポイントするように、領域参照を修飾するポインターの値を変更できます。または、領域を書き出して空にリセットすることもできます。

    AREA 条件は、ソース領域の最大サイズがターゲット領域の最大サイズを超える領域割り当てが試行されたときにも発生します。

  • ATTENTION

    ATTENTION 条件は、プログラムの実行中に端末で注意が通知されたときに発生します。この条件により、処理が中断されて、ATTENTION ON-unit に進みます。

    ATTENTION ON-unit から戻ると、割り込みが発生したポイントの直後のプログラム内のポイントから処理が再開されます。

  • CONDITION(name)

    CONDITION 条件は、適切な名前を指定する SIGNAL 文によって通知されます。SIGNAL 文で指定された名前は、どの CONDITION 条件を通知するかを指定します。CONDITION で指定する名前は条件名である必要があります。

    この条件を使用すると、CONDITION を含む SIGNAL 文が実行されて指定の名前が ON 文の名前に一致する場合に実行される ON-unit を確立できます。

    ON CONDITION 文の例を次に示します。

    ON CONDITION(OVERDRAFT) BEGIN; 
    
       PUT SKIP LIST('ACCOUNT HAD AN OVERDRAFT ON'||DATE())');
    
    END;
    .
    .
    .
    IF ACCOUNT_BALANCE < TOTAL WITHDRAWAL THEN SIGNAL CONDITION(OVERDRAFT);
  • CONVERSION

    CONVERSION 条件は、文字データに対して無効な変換が試行されるたびに通知されます。この試行は、数値変数への文字データの直接割り当て時または入出力操作時に実行できます。たとえば、固定長バイナリ値に変換される文字値に数値以外の文字が含まれている場合や、0 または 1 以外の文字がビット データ型に変換される場合に、この条件を発生させることができます。

    文字データのすべての変換は、左から右の順序で文字単位で実行されます。条件は無効な文字ごとに発生します。

    無効な文字が出現した場合は、ONSOURCE または ONCHAR 擬似変数を使用して ON-unit 内で無効な文字を置き換えることができます。

    CONVERSION ON-unit から戻ると、ONSOURCE または ONCHAR 疑似変数が使用されている場合にはプログラムによって変換が再試行されます。エラーが修正されない場合は、ERROR 条件が発生し、例外が発生したコードに制御が戻されます。

  • ENDFILE(f)

    ENDFILE 条件は、ファイルの終わりを過ぎて読み取りを試行したときに通知されます。ファイル制御ブロックのファイルの終わりステータスは、後続の読み取りでも信号が発生するように設定されたままになります。

    ON-unit から戻ると、GET または READ 文に続く文に制御が移されます。

  • ENDPAGE(f)

    ENDPAGE 条件は、書き込まれる行の行番号がページ サイズよりも大きいとき、または現在の行番号よりも小さい行番号を指定する行番号オプションが、f で識別される STREAM OUTPUT PRINT ファイルに対して発行されたときに通知されます。

    ON-unit が新しいページを書き込まずに制御を返す場合、ファイルの行番号は無制限に増加し、ENDPAGE 条件は後続の出力で通知されません。ただし、ON-unit によって、または後で新しいページが書き込まれると、行番号がリセットされ、次に行番号がページ サイズよりも大きかったときに ENDPAGE を通知できます。

    ON-unit から戻ると、信号が発生したポイントに戻り、追加の出力がストリームに書き込まれます。

    デフォルトの ON-unit は新しいページを配置し、制御を返します。

  • ERROR

    実装でエラーが検出されるたびに、ERROR 条件が通知されます。条件を通知する直前に、ONCODE 組み込み関数の値は、どのエラーが発生したかを示すエラー コードとして機能する実装定義の整数値に設定されます(詳細については、『Open PL/I ユーザー ガイド』を参照してください)。

    ON-unit から戻ると、エラー メッセージが生成され、STOP 文が実行されてプログラムの実行が終了します。

    デフォルトの ON-unit は、実装定義のエラー ファイルにエラー メッセージを書き込み、STOP 文を実行します(詳細については、『Open PL/I ユーザー ガイド』を参照してください)。

    ON ERROR 文の例を次に示します。

    ON ERROR BEGIN;
       PUT SKIP LIST ('AN UNIDENTIFIED ERROR OCCURRED'); 
    END;
  • FINISH

    FINISH 条件は、次の条件を処理します。

    • STOP 文が実行された。
    • メイン プロシージャで RETURN 文または END 文が実行された。
    • エラー状態が ON-unit で処理されないため、プログラムが終了する。

    デフォルトの ON-unit は何も実行せずに、単に制御を返します。ON FINISH ON-unit で STOP 文が実行された場合、結果は不確定です。

  • FIXEDOVERFLOW

    Open PL/I は、ON FIXEDOVERFLOW 文の構文を受け入れます。ただし、Open PL/I でサポートされているコンピューターでは、この条件に対する適切なハードウェア サポートがないため、FIXEDOVERFLOW 条件は発生しません (SIGNAL 文で明示的に発生させる場合を除く)。

  • KEY(f)

    KEY 条件は、KEY オプションを含む READ、REWRITE、または DELETE 文が指定のキーを持つレコードを見つけることができないときに通知されます。また、KEYFROM オプションで既存のレコードのキーが指定されている WRITE 文によっても通知されます。

    条件が通知される直前に、キー値は、ONKEY 組み込み関数によって返される値として割り当てられます。

    ON-unit から戻ると、レコード入出力文に続く文で実行が再開されます。

    ON KEY(f) 文の例を次に示します。

    ON KEY(OUTFILE) BEGIN;
       PUT SKIP LIST('INVALID KEY SPECIFIED FOR OUTFILE'); 
       PUT SKIP LIST('KEY WAS'||ONKEY());
    END;
  • OVERFLOW

    OVERFLOW 条件は、浮動小数点値の算術演算の結果が表現可能な最大値を超えたときに通知されます。

    10 進浮動値およびバイナリ浮動数の最大値については、『Open PL/I ユーザー ガイド』を参照してください。

    ON-unit から戻ると、エラー メッセージが生成され、STOP 文が実行されてプログラムの実行が終了します。

  • RECORD(f)

    RECORD 条件は、READ、WRITE、または REWRITE 操作中に発生させることができます。この条件は、次の場合に発生します。

    • レコード変数がレコード サイズよりも小さい。これには以下の理由のいずれかが考えられます。
      • レコードが READ INTO 文の変数よりも大きい。残りのレコードは失われます。
      • 固定長レコードを含むファイルに指定されたレコード長が WRITE 文または REWRITE 文の変数よりも大きい。残りのレコードは不確定です。変数が可変長文字列である場合、SCALARVARYING オプションがファイルに適用されていると、RECORD 条件は発生しません。
    • レコード変数がレコード サイズよりも大きい。これには以下の理由のいずれかが考えられます。
      1. 固定長レコードを含むファイルに指定されたレコード長が READ INTO 文の変数よりも小さい。残りの変数は不確定です。変数が可変長文字列である場合、SCALARVARYING オプションがファイルに適用されていると、RECORD 条件は発生しません。
      2. 最大レコード長が WRITE 文または REWRITE 文の変数よりも小さい。残りの変数は失われます。
      3. WRITE 文または REWRITE 文の変数が長さゼロを示している。送信は行われません。変数が可変長文字列である場合、SCALARVARYING オプションがファイルに適用されていると、RECORD 条件は発生しません。
    • レコード変数の長さがゼロであるか、埋め込みキーを格納するには短すぎる。これは、WRITE 文または REWRITE 文の変数が埋め込みキーを格納するには短すぎるために発生します。
  • SIZE
    注: SIZE は、パフォーマンスに影響を及ぼす可能性があるため、アプリケーションの開発時にのみ使用し、本番環境では削除する必要があります。

    SIZE はデフォルトでは無効になっています。Open PL/I では、この動作を有効にするための言語メカニズムである条件プレフィックスがサポートされていないため、別の方法が用意されています。

    次の Open-PLI ランタイム呼び出しが組み込みサブルーチンとして公開されています。
    dcl __mFp_set_size_condition entry(fixed bin(31) native) external('__mFp_set_size_condition');
    call __mFp_set_size_condition (1);  /*  enables the SIZE condition */
    call __mFp_set_size_condition (0);  /*  disables the SIZE condition */
    
  • UNDEFINEDFILE(f)

    UNDEFINEDFILE 条件は、ファイルを開こうとしているときにエラーが発生すると通知されます。

    ON-unit から戻ると、OPEN 文に続く文に制御が移ります。

  • UNDERFLOW

    UNDERFLOW 条件は、浮動小数点値の算術演算の結果の絶対値が表現可能な最小値よりも小さいときに通知されます(『Open PL/I ユーザー ガイド』を参照してください)。

    デフォルトの ON-unit は単に制御を返します。UNDERFLOW 条件を発生させた操作で生成された値はゼロに設定されます。

  • 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 もキャッチできます。

  • ZERODIVIDE

    ZERODIVIDE 条件は、除算演算の除数の値がゼロになったときに通知されます。結果の値は不確定です。

    ON-unit から戻ると、エラー メッセージが生成され、STOP 文が実行されてプログラムの実行が終了します。

制約事項

なし。