コマンド・プロシージャ内で実行されているコマンドまたはプログラムが, エラーを検出した場合,またはCTRL/Yによって割り込まれた場合に, 実行される動作を定義します。コマンド・インタプリタが, エラー・チェックまたはCTRL/Yによる割り込みを行う場合にだけ,実行されます。 省略時の設定では,これらは行われています。 ONコマンドは,コマンド・プロシージャの内部でだけ使用することができます。
ON 条件 THEN [$]コマンド
WARNING | 警告レベルのステータス($SEVERITY = 0) |
ERROR | エラー・レベルのステータス($SEVERITY = 2) |
SEVERE_ERROR | エラー・レベルのステータス($SEVERITY = 4) |
CONTROL_Y | SYS$INPUTでのCTRL/Yの入力 |
省略時のエラー条件は,ON ERROR THEN EXITです。
エラー条件を条件パラメータとして指定した場合は,指定した重大度レベルのエラー, またはそれ以上のエラーが発生するお,指定された動作が実行されます。
システムは,条件コードをグローバル・シンボル$STATUSに入れます。 条件コードの重大度は,$STATUSの下位3ビットで表されます。 この重大度は,グローバル・シンボル$SEVERITYでも表されます。 重大度の値についての詳細は,EXITコマンドの説明を参照してください。
ONコマンドの動作がエラーの重大度を指定する場合,コマンド・インタプリタは, 指定された重大度以上のレベルで,エラーに対するONコマンドの動作を実行します。 たとえば,次のコマンドは,警告,エラー,または重大エラーの発生時に, プロシージャを終了させます。
$ ON WARNING THEN EXIT
省略時の動作は,次のとおりです。
$ ON ERROR THEN EXIT
つまり,コマンド・インタプリタは,警告の発生時は続行し, エラーまたは重大エラーの発生時はEXITコマンドを実行します。 重大度を指定するONコマンド動作は,一度だけ実行されます。 ONコマンド動作が行われると,省略時のON動作が再設定されます。 省略時のON動作には,例外があります。 GOTOコマンドを使用して現在のコマンド・プロシージャに存在しないラベルを指定すると, コマンド・プロシージャは警告メッセージを出して終了します。
ONコマンドで指定された動作は, コマンドが実行されるコマンド・プロシージャ内だけに適用されます。 したがって,別のプロシージャを呼び出すプロシージャでONコマンドを実行する場合, ONコマンド動作はネストしたプロシージャには適用されません。 どのコマンド・プロシージャ・レベルで実行されるONコマンドも, 別のレベルのプロシージャのエラー状態処理には影響しません。
ONコマンドでエラー・チェックを禁止するには,SET NOONコマンドを使用します。 エラー・チェックを許可するには,SET ONコマンドを使用するか, ONコマンドを入力します。
ONコマンドには,コマンド・プロシージャの実行中に発生する Ctrl/Y割り込み用のアクション・ルーチンを定義する方法も提供されています。 省略時のCtrl/Yの動作では, Ctrl/Yコマンド・レベルでコマンド入力を求めるプロンプトが表示されます。 Ctrl/Yコマンド・レベルは,DCLコマンドを入力できる特殊なコマンド・レベルです。 コマンド・インタプリタ内で実行されるコマンドを入力する場合は, CONTINUEコマンドでプロシージャの実行を再開できます。 コマンド・インタプリタ内で実行されるコマンドの一覧については, 『OpenVMSユーザーズ・マニュアル』を参照してください。
他のDCLコマンドを入力すると,コマンド・インタプリタは,コマンド・レベル0に戻り, コマンドで起動されるイメージを実行します。 終了ハンドラを含むイメージの実行中にコマンド・プロシージャに割り込みをかけると, 新しいコマンド(イメージ)を実行する前に終了ハンドラを実行できます。 ただし,Ctrl/Yを押してコマンド・プロシージャに割り込みをかけてから STOPコマンドを入力すると, 割り込まれたイメージで宣言された終了ハンドラは実行されません。
ONコマンドを使用すると,Ctrl/Y割り込みの省略時の動作を変更できます。 Ctrl/Y動作の省略時の動作を変更した場合,Ctrl/Y割り込みの実行は, 自動的にはCtrl/Y動作の省略時に再設定されません。 Ctrl/Y動作は,次のいずれかが起きるまで有効です。
Ctrl/Y動作は,アクティブなコマンド・レベルごとに指定できます。 現在実行中のコマンド・レベルに指定されたCtrl/Y動作で, 前のレベルに指定された動作が上書きされます。
- 注意
- ON CONTROL_YコマンドおよびSET NOCONTROL=Yコマンドは, 特殊なアプリケーション用のコマンドです。
一般に,Ctrl/Y割り込みは,禁止にしないでください。 たとえば,Ctrl/Y割り込みを禁止にするプロシージャが制御不能ループに入ると, 端末からプロシージャを停止させることができなくなります。
$ ON SEVERE_ERROR THEN CONTINUEこの実行文がコマンド・プロシージャ内で実行された後で,警告,エラー, または重大なエラーが発生した場合には,プロシージャの実行が継続されます。 回復不可能な重大なエラーが発生した結果として,この実行文が1度実行されると, 省略時設定の動作(ON ERROR THEN EXIT)に戻ります。
$ ON ERROR THEN GOTO BYPASS $ RUN A $ RUN B . . . $ EXIT $ BYPASS: $ RUN CプログラムA,またはプログラムBが, エラーまたは重大なエラーを示す状態コードを返した場合には, 制御はBYPASSというラベルの実行文に移り,プログラムCが実行されます。
$ ON WARNING THEN EXIT . . . $ SET NOON $ RUN [SSTEST]LIBRA $ SET ON . . .このONコマンドは警告,エラー,または重大なエラーが発生した場合に, プロシージャを終了させることを指定しています。 そのあと,SET NOONコマンドは,RUNコマンドが実行される前に, エラー・チェックを禁止します。 したがって,LIBRA.EXEというプログラムからどの状態コードが戻されても, プロシージャは処理を継続します。 次のSET ONコマンドはエラー・チェックを再び有効にし,最新のON条件を再設定します。
$ ON CONTROL_Y THEN GOTO CTRL_EXIT . . . $ CTRL_EXIT: $ CLOSE INFILE $ CLOSE OUTFILE $ EXITONコマンドで,プロシージャの実行中にCtrl/Yが押された場合には, ラベルCTRL_EXITへ制御を移すように指定しています。 CTRL_EXITでは,後処理(この例の場合は,ファイルのクローズ)を実行します。
入出力のために,ファイルをオープンします。 OPENコマンドは,ファイルをオープンするときにファイルに論理名を与え, その名前をプロセス論理名テーブルに登録します。
制限事項については,各修飾子の説明を参照してください。
OPEN 論理名[:]ファイル指定
新しい順編成ファイルを作成するためには,/WRITE修飾子を使用します。 詳細は/WRITE修飾子の説明を参照してください。
OPENコマンドは,プロセス・パーマネントとしてファイルをオープンします。 したがって,CLOSEコマンドでクローズするか,ログアウトするまで, これらのファイルはオープンしています。 ファイルをオープンしたコマンド・プロシージャがそのファイルをクローズしないで終了すると, ファイルはオープンしたままになります。 コマンド・インタプリタは,自動的にはファイルをクローズしません。 OPENコマンドは,OpenVMS RMSを使用してファイルをオープンし, プロセス・パーマネント・ファイルの使用に関するRMS制限に従います。 OPENコマンドは,順編成ファイル,相対ファイル, または索引順編成ファイルをオープンします。
論理装置SYS$INPUT,SYS$OUTPUT,SYS$COMMAND,およびSYS$ERRORは, コマンド・レベルでの読み込みまたは書き込みの前に, 明示的にオープンする必要はありません。 他のすべてのファイルは,明示的にオープンしなければなりません。
異なるファイルをオープンする場合,同じ論理名を使用しないでください。 OPENコマンドで現在別のファイルに割り当てられている論理名を指定しても, 警告メッセージは出ません。ただし,ファイルはオープンされず,次のREAD要求は, 現在その論理名が割り当てられているファイルにアクセスします。
ファイルをオープンした後,はじめて/SHARE修飾子を使用すると,同じファイルに 2つ以上のOPENコマンドを入力し,異なる論理名を割り当てることができます。 /SHARE=READまたは/SHARE=WRITE修飾子を使用してファイルをオープンすると, 他のユーザはTYPEまたはSEARCHコマンドでそのファイルにアクセスできます。
OPENコマンドを使用して新しいファイルを作成する場合は, 可変固定長制御部(VFC)レコード形式が使用されます。 レコード形式に互換性がない場合は, このレコード形式のファイルに別のレコード形式のファイルを連結できないことがあります。 VFC形式を使用したくない場合は,CREATEコマンドを使用してファイルを作成します。
既存のファイルにOPENコマンドを指定すると, そのファイルのレコード・タイプが使用されます。
順編成ファイルの場合にのみ,複数ユーザが同時にレコードを追加することができます。
/APPEND修飾子は,既存のファイルにレコードを追加する場合にだけ使用できます。 /APPEND修飾子と/WRITE修飾子を,同時に指定することはできません。
エラーが発生し,指定されたラベルに制御を正常に移すことができた場合には, $STATUSというグローバル・シンボルに,そのエラーを示すコードが設定されます。
/SHARE修飾子が指定されない場合は,他のユーザは読み込みアクセスのみ行えます。
$ OPEN INPUT_FILE AVERAGE.DAT $ READ_LOOP: $ READ/END_OF_FILE=ENDIT INPUT_FILE NUM . . . $ GOTO READ_LOOP $ ENDIT: $ CLOSE INPUT_FILEこの例のOPENコマンドは, AVERAGE.DATという名前のファイルを入力ファイルとしてオープンし, そのファイルにINPUT_FILEという論理名を割り当てます。 省略時の設定によって,/READ修飾子が指定されていると解釈されるため, ファイルは読み込みアクセスのためにオープンされます。 READコマンドはINPUT_FILEという論理ファイルから, NUMという名前のシンボルにレコードを読み込みます。 コマンド・プロシージャはファイルの終わりに到達するまで, READ_LOOPというラベルとENDITというラベルの間の行を実行します。 ファイルの終わりに到達すると,CLOSEコマンドがファイルをクローズします。
$ OPEN/WRITE/ERROR=OPEN_ERROR OUTPUT_FILE TEMP.OUT $ COUNT = 0 $ WRITE_LOOP: $ COUNT = COUNT + 1 $ IF COUNT .EQ. 11 THEN GOTO ENDIT $ WRITE OUTPUT_FILE "Count is ''COUNT'." . . . $ GOTO WRITE_LOOP $ ENDIT: $ CLOSE OUTPUT_FILE $ EXIT $ $ OPEN_ERROR: $ WRITE SYS$OUTPUT "Cannot open file TEMP.OUT" $ EXITこの例では,/WRITE修飾子が指定されたOPENコマンドが, TEMP.OUTというファイルを作成し, そのファイルにOUTPUT_FILEという論理名を割り当てます。 TEMP.OUTは,順編成ファイルです。
/ERROR修飾子は,ファイルをオープンするときにエラーが発生した場合には, コマンド・インタプリタが, OPEN_ERRORというラベルの行に制御を移すことを指定しています。 コマンド・プロシージャは,COUNTシンボルの値が11になるまで, ファイルTEMP.OUTにレコードを書き込みます。
$ OPEN/READ INPUT_FILE TRNTO::DBA0:[COST]INVENTORY.DAT $ READ_LOOP: $ READ/END_OF_FILE=ENDIT INPUT_FILE NUM $ FIRST_CHAR = F$EXTRACT(0,1,NUM) $ WRITE SYS$OUTPUT FIRST_CHAR $ GOTO READ_LOOP $ ENDIT: $ CLOSE INPUT_FILEこのコマンド・プロシージャは, 遠隔ノードTRNTO上のファイルINVENTORY.DATを入力ファイルとしてオープンし, 論理名INPUT_FILEを割り当てています。 そして,READコマンドでINPUT_FILEからシンボルNUMにレコードを読み込んでいます。 次の2つのコマンドで, レコードから最初の文字を取り出してSYS$OUTPUTに書いています。 この処理は,ファイルの終わり(EOF)まですべてのレコードに対して続けられ, 最後にCLOSEコマンドで,ファイルをクローズし論理名INPUT_FILEを削除しています。