7.71.3 ON_ERRORの使用例
以下は、ON_ERRORコマンドの例です。
以下のRDML「入力および妥当性検査」プログラムについて考えます。
REQUEST FIELDS(#A #B #C #D #E)
BEGINCHECK
FILECHECK FIELD(#A) USING_FILE(ACHECK)
FILECHECK FIELD(#B) USING_FILE(BCHECK)
FILECHECK FIELD(#C) USING_FILE(CCHECK)
FILECHECK FIELD(#D) USING_FILE(DCHECK)
FILECHECK FIELD(#E) USING_FILE(ECHECK)
ENDCHECK
この妥当性検査ブロックは、前の検査に失敗した場合でも以降の検査がすべて実行されるため、あまり効率的とは言えません。例えば、#Aがエラーになった場合、#B、#C、#D、および#Eの検査は無駄になります。これは、ユーザーがフィールド#Aを修正したときに、これらのフィールドの検査を再度実行する必要があるからです。
ON_ERRORコマンドを使用すると、以下のように一連の「早期終了」を指定することで、上記の例ような妥当性検査ブロックの効率を高めることができます。
L10: REQUEST FIELDS(#A #B #C #D #E)
BEGINCHECK
FILECHECK FIELD(#A) USING_FILE(ACHECK)
ON_ERROR GOTO(L10)
FILECHECK FIELD(#B) USING_FILE(BCHECK)
ON_ERROR GOTO(L10)
FILECHECK FIELD(#C) USING_FILE(CCHECK)
ON_ERROR GOTO(L10)
FILECHECK FIELD(#D) USING_FILE(DCHECK)
ON_ERROR GOTO(L10)
FILECHECK FIELD(#E) USING_FILE(ECHECK)
ENDCHECK
すなわち、検査に失敗すると、制御がREQUESTコマンドに戻され、修正を促すためにエラーの詳細が表示されます。当然ながら、この手法には、特定のフィールドがエラーになった場合に、その最初のエラーが修正されない限り、以降のすべてのフィールドが検査されないという欠点もあります。