条件

本章では、OpenFrame PL/Iの条件設定について説明します。

1. 条件処理

条件処理(Condition Handling)は、PL/Iプログラミングが実行される際に発生する可能性のある例外処理です。

条件は、特定の条件が満たされると起こることがあり、またユーザーが直接引き起こすこともできます。条件が発生した場合、現在のプログラムは停止し、ユーザーが指定したONユニットを実行するか、ユーザーが指定したONユニットがない場合は、内部的に指定したデフォルトの処置を行います。ONユニットが実行された後、条件の特性によって、再び該当行に戻ってPL/Iプログラムが継続して実行されるか、プログラムが終了します。

1.1. ONステートメント

ONステートメントは、条件が発生した際に、指定したONユニットを実行するようにONユニットを登録します。

figure syntax 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ユニットを取り消します。

figure syntax revert
項目 説明

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ユニットを実行するように条件を引き起こします。

figure syntax signal
項目 説明

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

ANYCONDITION以外の条件が発生し、発生した条件のONユニットが存在しない場合に発生します。

AREA

基底付き変数を区域に割り当てられない場合や、AREA変数の割り当てを実行できない場合に発生します。

CONDITION

ユーザーが条件名を定義し、定義した名前で条件を登録および実行することができます。

CONVERSION

ASSIGNMENTステートメントまたは入出力の実行中に発生します。

ENDFILE

GETステートメントあるいはREADステートメントでデータセットの最後のレコードを読み取る場合に発生します。

ENDPAGE

PRINTファイルで指定したPAGESIZE値(デフォルト値:60)より現在の行数が大きい場合に発生します。

ERROR

条件の基本動作、または一部の条件の正常動作中に発生します。

FINISH

メイン・プロシージャが終了するときに発生します。

FIXEDOVERFLOW

FIXED DECIMAL算術演算の結果値が15桁を超えた場合に発生します。

KEY

ステートメントごとにKEY条件を使用します。

NAME

GETステートメントでデータ・ディレクティブ入出力中に発生します。

OVERFLOW

浮動小数点の最大値を超えた場合に発生します。

RECORD

READ、WRITE、REWRITEステートメントの変数の長さによって使用されます。

SIZE

ASSIGNMENTステートメントの実行時、または入出力中に発生することがあります。

TRANSMIT

入出力中に、RECORDあるいはKEY以外の条件のエラー状況で発生します。

UNDEFINEDFILE

ファイルを開けない場合に発生します。

UNDERFLOW

浮動小数点の値がゼロ以外のIEEE浮動小数点で表現できる最小値より小さい場合に発生します。

ZERODIVIDE

ゼロによる除算を試みた場合に発生します 。

ATTENTION、INVALIDOP、STORAGE、STRINGRANGE、STRINGSIZE、SUBSCRIPTRANGEはサポートしていません。

各条件についての詳細は、各節の説明を参照してください。条件の状態、文法、基本動作、正常動作、コードについて説明しています。

項目 説明

状態

条件の基本状態。有効、無効、常に有効の3つの状態に分けられます。

文法

条件の文法

基本動作

条件が発生した際、ONユニットがない場合の動作です。

正常動作

条件が発生した際、ONユニットがある場合にONユニットを実行した後の動作です。

コード

条件のコード値。条件コードについては、ONCODEを参照してください。

2.1. ANYCONDITION(略語 :ANYCOND)

ANYCONDITION条件は、ANYCONDITION以外の条件が発生し、発生した条件のONユニットが存在しない場合に起こります。

ユーザーが直接SIGNALステートメントを使用してANYCONDITIONを引き起こすことはできません。

以下は、ANYCONDITION条件についての説明です。

区分 説明

状態

常に有効

文法

figure syntax cond anycond

動作

  • 基本動作:発生した条件の基本動作に従います。

  • 正常動作:発生した条件の正常動作に従います。

コード

なし

2.2. AREA

AREA条件は、次のような状況で発生します。

  • 基底付き変数をある区域に割り当てたとき、その区域に基底付き変数に指定したサイズの割り当て領域が不足する場合

  • AREA変数を他のAREA変数に割り当てたとき、ターゲット区域に割り当てられたサイズがソース区域のサイズより大きい場合

以下は、AREA条件についての説明です。

区分 説明

状態

常に有効

文法

figure syntax cond area

動作

  • 基本動作:ERROR条件が発生します。

  • 正常動作: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条件についての説明です。

区分 説明

状態

常に有効

文法

figure syntax cond condition

동작

  • 基本動作:SIGNALステートメントに移動し、プログラムが続行されます。

  • 正常動作:SIGNALステートメントに移動し、プログラムが続行されます。

コード

500

2.4. CONVERSION(略語:CONV)

CONVERSION条件は、ASSIGNMENTステートメントあるいは入出力の実行中に発生します。

CONVERSION条件が発生する状況は以下のとおりです。

  • 文字をビットに変換した際に、文字に0と1以外の値が存在する場合

  • 文字を算術データに変換した際に、数字ではない値が存在する場合

  • 文字ピクチャーに変換した際に、ピクチャー定義で許可されていない値が存在する場合

CONVERSION条件が発生した場合、ONユニットでONCHARまたはONSOURCE組み込み関数を使用して、変換が発生したデータ値を確認することができます。また、ONCHAR、ONSOURCE疑似変数を使用して、変換が発生したデータ値を変更することができます。詳細については、ONSOURCEONCHARを参照してください。

以下は、CONVERSION条件についての説明です。

区分 説明

状態

有効

文法

figure syntax cond conv

動作

  • 基本動作:ERROR条件が起こります。

  • 正常動作:ONユニットでONCHAR、ONSOURCE疑似変数を使用してデータを変更した場合は、変換を再試行します。疑似変数を使用してデータを変更しない場合は、ERROR条件が起こります。

コード

600、612、615、618

2.5. ENDFILE

ENDFILE条件は、GETステートメントあるいはREADステートメントでデータセットの最後のレコードを読み込んだ場合に発生します。

以下は、ENDFILE条件についての説明です。

区分 説明

状態

常に有効

文法

figure syntax cond endfile

  • file-reference:ファイル終了をチェックするファイルを指定します。省略する場合、SYSINファイルが指定されます。

動作

  • 基本動作:ERROR条件が起こります。

  • 正常動作:ファイル終了が発生したステートメントに移動し、プログラムの実行が続行されます。

コード

70

2.6. ENDPAGE

ENDPAGE条件は、PRINTファイルで指定したPAGESIZE値(デフォルト値:60)より現在の行数が大きい場合に発生します。

ONユニットでPAGEオプションあるいはPAGEフォーマット項目を使用して新しいページを開始することができ、行数は1に初期化されます。新しいページを開始しない場合、行数は継続して増加し、新しいページを開始するまでENDPAGE条件は起こりません。

以下は、ENDPAGE条件についての説明です。

区分 説明

状態

常に有効

文法

figure syntax cond endpage

  • file-reference:ページ終了をチェックするファイルを指定します。省略する場合、SYSPRINTファイルが指定されます。

動作

  • 基本動作:正常にプログラムを実行します。

  • 正常動作:正常にプログラムを実行します 。

コード

90

2.7. ERROR

ERROR条件は、それぞれの条件の基本動作、または一部の条件の正常動作により発生します。定義していないエラー状況でも、ERROR条件が発生することがあります。

ERROR条件のONユニットを実行中にERROR条件が発生すると、再度ERROR条件のONユニットを実行するため、無限ループに陥ることがあります。ERROR条件のONユニットの最初に「ON ERROR SYSTEM;」文を入れると、ERROR条件の基本動作を実行するように指定し、ERROR条件に対する無限ループ問題を防ぐことができます。

以下は、ERROR条件についての説明です。

区分 説明

状態

常に有効

文法

figure syntax cond error

動作

  • 基本動作:FINISH条件が起こります。

  • 正常動作:基本動作と同じです。

コード

1000以上

2.8. FINISH

FINISH条件は、メイン・プロシージャが終了するときに発生します。

以下は、FINISH条件についての説明です。

区分 説明

状態

有効

文法

figure syntax cond 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条件についての説明です。

区分 説明

状態

有効

文法

figure syntax cond fofl

動作

  • 基本動作:ERROR条件が起こります。

  • 正常動作:プログラムが正常に実行されます。演算の結果は正常でないことがあります。

コード

310

2.10. KEY

KEY条件は、以下のような状況で発生します。

  • READ、REWRITE、DELETEステートメントでKEYオプションに対するレコードが存在しない場合

  • WRITE、LOCATEステートメントでKEYFROMオプションに対するデータセットにすでに該当キーが存在する場合

  • 索引付きデータセットで定義したキーの長さと、KEYオプションで指定した変数の長さが異なる場合

LOCATEステートメントを使用した場合、KEY条件は次のLOCATEステートメント、またはFLUSHステートメント、あるいはCLOSEステートメントを使用した際に起こります。

以下は、KEY条件についての説明です。

区分 説明

状態

常に有効

文法

figure syntax cond key

  • file-reference:キーをチェックするファイルを指定します。

動作

  • 基本動作:ERROR条件が起こります。

  • 正常動作:プログラムが正常に実行されます。該当入出力ステートメントは実行されないことがあります。

コード

50、51、52

2.11. NAME

NAME条件は、以下のような状況で、GETステートメントでデータ・ディレクティブ入出力中に発生します。

  • 一致する名前が存在しないか、正しくない場合

  • 配列の添字が存在しないか、正しくない場合

以下は、NAME条件についての説明です。

区分 説明

状態

常に有効

文法

figure syntax cond name

  • file-reference:NAMEをチェックするファイルを指定します。

動作

  • 基本動作:正しくないフィールドは無視して、GETステートメントを継続して実行します。

  • 正常動作:GETステートメントを継続して実行します。

コード

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条件についての説明です。

区分 説明

状態

有効

文法

figure syntax cond ofl

動作

  • 基本動作:ERROR条件が起こります。

  • 正常動作:ERROR条件が起こります。

コード

300

2.13. RECORD

RECORD条件は、以下のような状況で起こります。

  • データセットのレコード長が、READステートメントの変数の長さより大きい場合

  • データセットのレコード長が、WRITE、REWRITEステートメントの変数の長さより小さい場合

RECORD条件が起こる場合、超過した長さは切り捨てられます。

以下は、RECORD条件についての説明です。

区分 説明

状態

常に有効

文法

figure syntax cond record

  • file-reference:レコードをチェックするファイルを指定します。

動作

  • 基本動作:ERROR条件が起こります。

  • 正常動作:プログラムが正常に実行されます。超過した長さは切り捨てられます。

コード

21、22

2.14. SIZE

SIZE条件は、ASSIGNMENTステートメントの実行時、または入出力中に発生することがあります。

SIZE条件が発生する可能性のある具体的な状況は以下のとおりです。

  • ASSIGNMENT ステートメント実行時に、最も左の桁の数字が失われる場合

  • 入出力実行時に、最も左の桁の数字が失われる場合

以下は、SIZE条件についての説明です。

区分 説明

状態

無効

文法

figure syntax cond size

動作

  • 基本動作:ERROR条件が起こります。

  • 正常動作:プログラムが正常に実行されます。

コード

340

2.15. TRANSMIT

TRANSMIT条件は、入出力中にRECORD条件あるいはKEY条件以外のエラー状況で起こります。

OpenFrame PL/IはOpenFrameのファイル・システムを使用するため、TRANSMIT条件が発生した場合は、OpenFrameのエラー・メッセージを参照します。

以下は、TRANSMIT条件についての説明です。

区分 説明

状態

常に有効

文法

figure syntax cond transmit

  • file-reference:TRANSMITをチェックするファイルを指定します。

動作

  • 基本動作:ERROR条件が起こります。

  • 正常動作:プログラムが正常に実行されます。

    該当の入出力ステートメントは実行されないことがあります。また、該当のデータセットに問題がある場合は、TRANSMIT条件が起こり続けることがあります。

コード

41、42

2.16. UNDEFINEDFILE(略語:UNDF)

UNDEFINEDFILE条件は、ファイルを開けない場合に起こります。

以下のような状況で起こります。

  • すでにファイルが開かれている場合

  • DDが見つからない場合

  • データセットの情報を取得できない場合

  • データセットの属性とファイルで指定した属性が衝突した場合

  • 索引付きデータセットのキーの長さがゼロの場合

  • 索引付きデータセットでKEYLOCオプションの値を定義した際にKEYLENGTH + KEYLOCの値がレコード長より大きい場合

以下は、UNDEFINEDFILE条件についての説明です。

区分 説明

状態

常に有効

文法

figure syntax cond udfl

  • file-reference:UNDEFINEDFILEをチェックするファイルを指定します。

動作

  • 基本動作:ERROR条件が起こります。

  • 正常動作:正常にプログラムが実行されますが、入出力ステートメントを使用した場合はエラーが発生することがあります。

コード

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条件についての説明です。

区分 説明

状態

有効

文法

figure syntax cond ufl

動作

  • 基本動作:ERROR条件が起こります。

  • 正常動作:ERROR条件が起こります。

コード

330

2.18. ZERODIVIDE(略語:ZDIV)

ZERODIVIDE条件は、ゼロによる除算を試みた場合に起こります。この条件は、固定小数点と浮動小数点の除算でも起こります。ZERODIVIDE条件を無効にした場合、プログラムはエラーが発生することがあります。

以下は、ZERODIVIDE条件についての説明です。

区分 説明

状態

有効

文法

figure syntax cond zdiv

動作

  • 基本動作:ERROR条件が起こります。

  • 正常動作:ERROR条件が起こります。

コード

320