条件
本章では、OpenFrame PL/Iの条件設定について説明します。
1. 条件処理
条件処理(Condition Handling)は、PL/Iプログラミングが実行される際に発生する可能性のある例外処理です。
条件は、特定の条件が満たされると起こることがあり、またユーザーが直接引き起こすこともできます。条件が発生した場合、現在のプログラムは停止し、ユーザーが指定したONユニットを実行するか、ユーザーが指定したONユニットがない場合は、内部的に指定したデフォルトの処置を行います。ONユニットが実行された後、条件の特性によって、再び該当行に戻ってPL/Iプログラムが継続して実行されるか、プログラムが終了します。
1.1. ONステートメント
ONステートメントは、条件が発生した際に、指定したONユニットを実行するようにONユニットを登録します。

項目 | 説明 |
---|---|
condition |
1つ以上の条件を指定します。条件については、条件タイプを参照してください。 |
SNAP |
サポートしていません。 |
SYSTEM |
条件が発生した際に、基本動作を実行するように指定します。基本動作の詳細については、条件タイプを参照してください。 |
ON-unit |
条件が発生した際に実行されるステートメントを記述します。 単一のステートメントまたは開始ブロックのいずれかを指定できます。 ONユニットは、ONステートメントが実行される時点ではなく、条件が発生した際に実行されます。 |
登録した条件の発生条件を満たした場合にONユニットが実行されます。同じ条件を複数回登録すると、最後に登録されたONステートメントのONユニットが実行されます。 ONステートメントに登録した条件は、ONステートメントが含まれているブロックあるいはプロシージャが終了する際に解除されます。また、REVERTステートメントを使用してユーザーが直接解除することもできます。
以下は、ZERODIVIDE条件を登録する例です。
ON ZERODIVIDE BEGIN; DISPLAY('ZERODIVIDE condition raised'); END; A = B / 0;
ZERODIVIDE条件は、ゼロで割る際に発生する条件です。「A = B / 0」によってZERODIVIDE条件が起こると、ONステートメントに登録したONユニットが実行され、DISPLAY文が実行されます。
1.2. REVERTステートメント
REVERTステートメントは、ONステートメントを使用して登録したONユニットを取り消します。

項目 | 説明 |
---|---|
condition |
1つ以上の条件を指定します。条件については、条件タイプを参照してください。 |
REVERTステートメントは、現在のブロックあるいはプロシージャに登録されているONユニットを取り消します。現在のブロックあるいはプロシージャに登録されているONユニットがない場合、REVERTステートメントは実行されません。上位ブロックあるいはプロシージャで登録したONユニットは取り消すことができません。
以下は、REVERTステートメントを使用して、登録したONユニットを取り消す例です。
ON ZERODIVIDE BEGIN; DISPLAY('ZERODIVIDE condition raised'); END; REVERT ZERODIVIDE; A = B / 0;
「A = B / 0;」によってZERODIVIDE条件が起こっても、ONステートメントに登録したONユニットがREVERTステートメントによって取り消されたため、そのONユニットは実行されません。現在登録されているONユニットがない場合、条件の特性によってデフォルトの処置を取ります。ここでは、ERROR条件を発生させるか、プログラムの実行を続行します。ZERODIVIDE条件は、デフォルトの処置としてERROR条件を発生させます。
1.3. SIGNALステートメント
SIGNALステートメントは、ユーザーが直接ONユニットを実行するように条件を引き起こします。

項目 | 説明 |
---|---|
condition |
条件を指定します。条件については、条件タイプを参照してください。 |
ユーザーが登録したONユニットが存在する場合は、そのONユニットを実行し、ユーザーが指定したONユニットが存在しない場合は、内部的に指定されたデフォルトの処置を行います。
以下は、SIGNALステートメントを使用して、ユーザーが直接ONユニットを実行させる例です。
ON ZERODIVIDE BEGIN; DISPLAY('ZERODIVIDE condition raised'); END; SIGNAL ZERODIVIDE;
SIGNALステートメントによってZERODIVIDE条件のONユニットが実行されます。入出力に関連する条件は、その条件が発生しても、ファイルが異なる場合はONユニットは実行されません。
1.4. 条件接頭語
ユーザーは条件接頭語(Condition Prefix)を使用して、条件を有効あるいは無効にすることができます。
条件接頭語は、ステートメント、開始ブロック、プロシージャの前に位置します。開始ブロックやプロシージャの前に位置した場合、そのブロックやプロシージャ内のすべてのステートメントに条件接頭語が適用されます。
以下は、条件接頭語を使用して、条件を有効あるいは無効にする例です。
(SIZE):A:PROCEDURE; ... (NOSIZE) B = C; D = E; ... END A;
基本的に、PROCEDURE A内のステートメントはSIZE接頭語を使用してSIZE条件をチェックします。NOSIZE接頭語を付けた「B = C;」では、SIZE条件をチェックしません。条件接頭語の優先順位は、ステートメントの前にある条件接頭語が優先して適用され、ステートメントの前に条件接頭語がない場合は、上位ブロックの接頭語が適用されます。条件接頭語がない場合は、デフォルトの接頭語が適用されます。
条件を有効にした場合、コンパイラーは条件を引き起こすことができるかをチェックして、条件を満たす場合、その条件のONユニットを探して実行します。条件接頭語で条件を無効にした状態で条件が発生した場合、プログラムはエラーとなることがあります。
入出力関連の条件と一部の条件は、条件接頭語を使用して条件を無効にすることができません。条件を有効・無効にした場合のデフォルト値は、条件タイプを参照してください。
2. 条件タイプ
本節では、それぞれの条件について説明します。
現在OpenFrame PL/Iでサポートしている条件は以下のとおりです。
条件 | 説明 |
---|---|
ANYCONDITION以外の条件が発生し、発生した条件のONユニットが存在しない場合に発生します。 |
|
基底付き変数を区域に割り当てられない場合や、AREA変数の割り当てを実行できない場合に発生します。 |
|
ユーザーが条件名を定義し、定義した名前で条件を登録および実行することができます。 |
|
ASSIGNMENTステートメントまたは入出力の実行中に発生します。 |
|
GETステートメントあるいはREADステートメントでデータセットの最後のレコードを読み取る場合に発生します。 |
|
PRINTファイルで指定したPAGESIZE値(デフォルト値:60)より現在の行数が大きい場合に発生します。 |
|
条件の基本動作、または一部の条件の正常動作中に発生します。 |
|
メイン・プロシージャが終了するときに発生します。 |
|
FIXED DECIMAL算術演算の結果値が15桁を超えた場合に発生します。 |
|
ステートメントごとにKEY条件を使用します。 |
|
GETステートメントでデータ・ディレクティブ入出力中に発生します。 |
|
浮動小数点の最大値を超えた場合に発生します。 |
|
READ、WRITE、REWRITEステートメントの変数の長さによって使用されます。 |
|
ASSIGNMENTステートメントの実行時、または入出力中に発生することがあります。 |
|
入出力中に、RECORDあるいはKEY以外の条件のエラー状況で発生します。 |
|
ファイルを開けない場合に発生します。 |
|
浮動小数点の値がゼロ以外のIEEE浮動小数点で表現できる最小値より小さい場合に発生します。 |
|
ゼロによる除算を試みた場合に発生します 。 |
ATTENTION、INVALIDOP、STORAGE、STRINGRANGE、STRINGSIZE、SUBSCRIPTRANGEはサポートしていません。 |
各条件についての詳細は、各節の説明を参照してください。条件の状態、文法、基本動作、正常動作、コードについて説明しています。
項目 | 説明 |
---|---|
状態 |
条件の基本状態。有効、無効、常に有効の3つの状態に分けられます。 |
文法 |
条件の文法 |
基本動作 |
条件が発生した際、ONユニットがない場合の動作です。 |
正常動作 |
条件が発生した際、ONユニットがある場合にONユニットを実行した後の動作です。 |
コード |
条件のコード値。条件コードについては、ONCODEを参照してください。 |
2.1. ANYCONDITION(略語 :ANYCOND)
ANYCONDITION条件は、ANYCONDITION以外の条件が発生し、発生した条件のONユニットが存在しない場合に起こります。
ユーザーが直接SIGNALステートメントを使用してANYCONDITIONを引き起こすことはできません。
以下は、ANYCONDITION条件についての説明です。
区分 | 説明 |
---|---|
状態 |
常に有効 |
文法 |
|
動作 |
|
コード |
なし |
2.2. AREA
AREA条件は、次のような状況で発生します。
-
基底付き変数をある区域に割り当てたとき、その区域に基底付き変数に指定したサイズの割り当て領域が不足する場合
-
AREA変数を他のAREA変数に割り当てたとき、ターゲット区域に割り当てられたサイズがソース区域のサイズより大きい場合
以下は、AREA条件についての説明です。
区分 | 説明 |
---|---|
状態 |
常に有効 |
文法 |
|
動作 |
|
コード |
360、361、362 |
2.3. CONDITION(略語 :COND)
ユーザーは条件名を定義し、定義した名前で条件を登録および実行することができます。
CONDITION条件は、SIGNALステートメントでのみ実行することができます。CONDITION条件を登録および実行するには、CONDITION属性を使用して条件名を定義する必要があります。
以下は、CONDITION属性を使用して条件名を定義する例です。
DCL TEST CONDITION;
以下は、条件名で条件を登録および実行する例です。
ON CONDITION (TEST) BEGIN; ... END; ... SIGNAL CONDITION (TEST);
以下は、CONDITION条件についての説明です。
区分 | 説明 |
---|---|
状態 |
常に有効 |
文法 |
|
동작 |
|
コード |
500 |
2.4. CONVERSION(略語:CONV)
CONVERSION条件は、ASSIGNMENTステートメントあるいは入出力の実行中に発生します。
CONVERSION条件が発生する状況は以下のとおりです。
-
文字をビットに変換した際に、文字に0と1以外の値が存在する場合
-
文字を算術データに変換した際に、数字ではない値が存在する場合
-
文字ピクチャーに変換した際に、ピクチャー定義で許可されていない値が存在する場合
CONVERSION条件が発生した場合、ONユニットでONCHARまたはONSOURCE組み込み関数を使用して、変換が発生したデータ値を確認することができます。また、ONCHAR、ONSOURCE疑似変数を使用して、変換が発生したデータ値を変更することができます。詳細については、ONSOURCEとONCHARを参照してください。
以下は、CONVERSION条件についての説明です。
区分 | 説明 |
---|---|
状態 |
有効 |
文法 |
|
動作 |
|
コード |
600、612、615、618 |
2.5. ENDFILE
ENDFILE条件は、GETステートメントあるいはREADステートメントでデータセットの最後のレコードを読み込んだ場合に発生します。
以下は、ENDFILE条件についての説明です。
区分 | 説明 |
---|---|
状態 |
常に有効 |
文法 |
|
動作 |
|
コード |
70 |
2.6. ENDPAGE
ENDPAGE条件は、PRINTファイルで指定したPAGESIZE値(デフォルト値:60)より現在の行数が大きい場合に発生します。
ONユニットでPAGEオプションあるいはPAGEフォーマット項目を使用して新しいページを開始することができ、行数は1に初期化されます。新しいページを開始しない場合、行数は継続して増加し、新しいページを開始するまでENDPAGE条件は起こりません。
以下は、ENDPAGE条件についての説明です。
区分 | 説明 |
---|---|
状態 |
常に有効 |
文法 |
|
動作 |
|
コード |
90 |
2.7. ERROR
ERROR条件は、それぞれの条件の基本動作、または一部の条件の正常動作により発生します。定義していないエラー状況でも、ERROR条件が発生することがあります。
ERROR条件のONユニットを実行中にERROR条件が発生すると、再度ERROR条件のONユニットを実行するため、無限ループに陥ることがあります。ERROR条件のONユニットの最初に「ON ERROR SYSTEM;」文を入れると、ERROR条件の基本動作を実行するように指定し、ERROR条件に対する無限ループ問題を防ぐことができます。
以下は、ERROR条件についての説明です。
区分 | 説明 |
---|---|
状態 |
常に有効 |
文法 |
|
動作 |
|
コード |
1000以上 |
2.8. FINISH
FINISH条件は、メイン・プロシージャが終了するときに発生します。
以下は、FINISH条件についての説明です。
区分 | 説明 |
---|---|
状態 |
有効 |
文法 |
|
動作 |
|
コード |
4 |
2.9. FIXEDOVERFLOW(略語:FOFL)
FIXEDOVERFLOW条件は、FIXED DECIMALタイプの算術演算の結果値が15桁を超えた場合に発生します。
以下のような場合、FIXEDOVERFLOW条件が起こります。
DCL A FIXED DEC(15) INIT(1234567890); DCL B FIXED DEC(15) INIT(123456); DISPLAY(A * B);
上の例において、A * B演算の結果が16桁でFIXED DECIMALの最大桁数を超えたため、FIXEDOVERFLOW条件が起こります。
演算結果がFIXED BINARYの場合、FIXEDOVERFLOW条件は起こりません。ADD、SUB、MUL、DIV組み込み関数ではFIXEDOVERFLOW条件は起こりません。
以下は、FIXEDOVERFLOW条件についての説明です。
区分 | 説明 |
---|---|
状態 |
有効 |
文法 |
|
動作 |
|
コード |
310 |
2.10. KEY
KEY条件は、以下のような状況で発生します。
-
READ、REWRITE、DELETEステートメントでKEYオプションに対するレコードが存在しない場合
-
WRITE、LOCATEステートメントでKEYFROMオプションに対するデータセットにすでに該当キーが存在する場合
-
索引付きデータセットで定義したキーの長さと、KEYオプションで指定した変数の長さが異なる場合
LOCATEステートメントを使用した場合、KEY条件は次のLOCATEステートメント、またはFLUSHステートメント、あるいはCLOSEステートメントを使用した際に起こります。
以下は、KEY条件についての説明です。
区分 | 説明 |
---|---|
状態 |
常に有効 |
文法 |
|
動作 |
|
コード |
50、51、52 |
2.11. NAME
NAME条件は、以下のような状況で、GETステートメントでデータ・ディレクティブ入出力中に発生します。
-
一致する名前が存在しないか、正しくない場合
-
配列の添字が存在しないか、正しくない場合
以下は、NAME条件についての説明です。
区分 | 説明 |
---|---|
状態 |
常に有効 |
文法 |
|
動作 |
|
コード |
10 |
2.12. OVERFLOW(略語:OFL)
OVERFLOW条件は、浮動小数点の最大値を超えた場合に発生します。
浮動小数点の最大値は以下のとおりです。
-
FLOAT DECIMALの桁数1~6、FLOAT BINARYの桁数1~21 :3. 40282347E+38F
-
FLOAT DECIMALの桁数7~16、FLOAT BINARYの桁数22~53 :1.7976931348623157E+308
負数の値も同様に、該当最大値を超えた場合にオーバーフローが発生します。 |
以下は、OVERFLOW条件についての説明です。
区分 | 説明 |
---|---|
状態 |
有効 |
文法 |
|
動作 |
|
コード |
300 |
2.13. RECORD
RECORD条件は、以下のような状況で起こります。
-
データセットのレコード長が、READステートメントの変数の長さより大きい場合
-
データセットのレコード長が、WRITE、REWRITEステートメントの変数の長さより小さい場合
RECORD条件が起こる場合、超過した長さは切り捨てられます。
以下は、RECORD条件についての説明です。
区分 | 説明 |
---|---|
状態 |
常に有効 |
文法 |
|
動作 |
|
コード |
21、22 |
2.14. SIZE
SIZE条件は、ASSIGNMENTステートメントの実行時、または入出力中に発生することがあります。
SIZE条件が発生する可能性のある具体的な状況は以下のとおりです。
-
ASSIGNMENT ステートメント実行時に、最も左の桁の数字が失われる場合
-
入出力実行時に、最も左の桁の数字が失われる場合
以下は、SIZE条件についての説明です。
区分 | 説明 |
---|---|
状態 |
無効 |
文法 |
|
動作 |
|
コード |
340 |
2.15. TRANSMIT
TRANSMIT条件は、入出力中にRECORD条件あるいはKEY条件以外のエラー状況で起こります。
OpenFrame PL/IはOpenFrameのファイル・システムを使用するため、TRANSMIT条件が発生した場合は、OpenFrameのエラー・メッセージを参照します。
以下は、TRANSMIT条件についての説明です。
区分 | 説明 |
---|---|
状態 |
常に有効 |
文法 |
|
動作 |
|
コード |
41、42 |
2.16. UNDEFINEDFILE(略語:UNDF)
UNDEFINEDFILE条件は、ファイルを開けない場合に起こります。
以下のような状況で起こります。
-
すでにファイルが開かれている場合
-
DDが見つからない場合
-
データセットの情報を取得できない場合
-
データセットの属性とファイルで指定した属性が衝突した場合
-
索引付きデータセットのキーの長さがゼロの場合
-
索引付きデータセットでKEYLOCオプションの値を定義した際にKEYLENGTH + KEYLOCの値がレコード長より大きい場合
以下は、UNDEFINEDFILE条件についての説明です。
区分 | 説明 |
---|---|
状態 |
常に有効 |
文法 |
|
動作 |
|
コード |
93 |
2.17. UNDERFLOW(略語:UFL)
UNDERFLOW条件は、浮動小数点の値が0以外のIEEE浮動小数点で表現できる最大値より小さい場合に起こります。
浮動小数点の最大値は以下のとおりです。
-
FLOAT DECIMALの桁数1~6、FLOAT BINARYの桁数1~21 :1. 17549435E-38F
-
FLOAT DECIMALの桁数7~16、FLOAT BINARYの桁数22~53 :2. 2250738585072014E-308
負数の値も同様に、該当最大値より小さい場合はアンダーフローが発生します。 |
以下は、UNDERFLOW条件についての説明です。
区分 | 説明 |
---|---|
状態 |
有効 |
文法 |
|
動作 |
|
コード |
330 |