OpenVMS
OpenVMS ユーザーズ・マニュアル
13.7.1 終了方法 | |
コマンド・プロシージャの実行中に,そのプロシージャを終了するには,次の 3 種類の方法を使用できます。
- コマンド・プロシージャに EXIT コマンドを指定する方法
- コマンド・プロシージャに STOP コマンドを指定する方法
- プログラムの実行中に Ctrl/Y を入力する方法
EXIT コマンドによる終了
コマンド・プロシージャは,プロシージャの終わりに到達するか, EXIT コマンドを検出すると終了します。いずれの場合も,次に高いコマンド・レベルに制御が戻ります。 EXIT コマンドによって終了する場合,状態値を EXIT コマンドのパラメータとして指定すれば,その状態値を次に高いコマンド・レベルに戻すことができます。
たとえば,DCL コマンド・レベルで SUB を起動し,SUB が SUB1 を呼び出すと,次のようなアクションが生じます。
- SUB1 を終了すると,SUB1 を呼び出した後のコマンド行で SUB に戻る。
- SUB を終了すると,DCL コマンド・レベルに戻る。
STOP コマンドによる終了
STOP コマンドによって終了した場合には, STOP コマンドを実行するコマンド・レベルにかかわらず,制御はいつでも DCL コマンド・レベルに戻ります。
バッチ・ジョブの中で STOP コマンドを実行すると,バッチ・ジョブが終了します。
Ctrl/Y による終了
Ctrl/Y を押して,コマンド・プロシージャを中断させてから, EXIT コマンドまたは STOP コマンドを使用してプロシージャを終了することができます。この場合, EXITまたは STOP どちらのコマンドを使用した場合でもDCL レベルに戻ります。
次の例では,Ctrl/Y を押すことにより,TESTALL プロシージャに割り込みがかかります。EXIT コマンドはプロシージャの処理を終了し, DCL レベルに戻ります ( プロシージャに割り込みをかけた後,STOP コマンドを入力することもできます )。
$ @TESTALL[Return]
[Ctrl/Y]
$ EXIT[Return]
$
|
13.7.2 終了処理ルーチン | |
コマンド・プロシージャを中断させる場合,コマンド (イメージ) が終了処理ルーチンを宣言するものであると, EXIT コマンドは終了処理ルーチンに制御を渡します。ただし,STOP コマンドはこれらのルーチンを実行しません。
省略時の設定では,コマンド・インタプリタは,コマンドを実行してエラーまたは重大エラーが生じると EXIT コマンドを実行します。このとき,プロシージャは終了して前のコマンド・レベルに戻ります。他の重大度 ( 成功,警告,通知エラー ) の場合には,コマンド・プロシージャの処理が継続されます。
コマンド・インタプリタは以上のようにしてエラー処理を行いますが,ユーザがコマンド・プロシージャの中のラベルを参照したときに,そのラベルが存在しない場合 ( たとえば,GOTO ERR1 コマンドをコマンド・プロシージャ内に指定したが, ERR1 がプロシージャ内でラベルとして使用されていない場合 ) には,警告メッセージを出してコマンド・プロシージャは終了します。
システムがエラー処理ルーチンの一部として EXIT コマンドを出した場合は, $STATUSの値は直前のコマンド・レベルに戻されます。このとき,コマンド・インタプリタは $STATUS の上位桁を 1 に設定するため,状態値に関連するメッセージを再表示しません。
たとえば,次のコマンド・プロシージャ TEST.COM には,出力ファイル指定にエラーがあります。
$ CREATE DUMMY.DAT\
THIS IS A TEST FILE
$ SHOW TIME
|
このプロシージャを実行すると,CREATE コマンドが $STATUS にエラーを戻し,対応するメッセージを表示します。このとき,コマンド・インタプリタは $STATUS の値を調べて,エラーが生じたかどうかを判別し,EXIT コマンドを出して $STATUS の値を戻します。 CREATE コマンドはすでに 1 回メッセージを表示したため,プロシージャが終了してもエラー・メッセージは再表示されません。 DCL コマンド・レベルでは,$STATUS にエラー・メッセージが保持されていますが,上位桁は 1 に設定されています。
$ @TEST
%CREATE-E-OPENOUT, error opening DUMMY.DAT\ as output
-RMS-F-SYN, file specification syntax error
%DCL-W-SKPDAT, image data (records not beginning with "$") ignored
$ SHOW SYMBOL $STATUS
$STATUS = "%X109110A2"
$ WRITE SYS$OUTPUT F$MESSAGE(%X109110A2)
%CREATE-E-OPENOUT, error opening !AS as output
|
13.8.1 省略時のエラー処理 | |
次の表は,コマンド・プロシージャの実行中に,エラーが発生したり, Ctrl/Y による割り込みが発生したときに,実行される省略時の処理を示しています。これらの省略時の処理は,ON,SET [NO]ON,SET [NO]CONTROL=Y コマンドを使用して変更できます。
エラーまたは重大なエラー
|
プロシージャを終了し,次のコマンド・レベルに戻る。
|
DCL コマンド・レベルまたはコマンド・レベル 1 での Ctrl/Y
|
プロシージャに割り込みがかかる。他のイメージによって強制的に終了されない場合には,プロシージャを続行できる。
|
レベル 1 より下のコマンド・レベルでの Ctrl/Y
|
プロシージャは終了し,次の上位コマンド・レベルに移動する。
|
これ以降の節では,その他のエラー処理方法を説明します。
13.9.1 ON コマンド | |
ON コマンドは,特定の重大度またはそれ以上の重大度のエラーが生じたときに実行されるアクションを指定します。このようなエラーが生じた場合には,システムは次のようなアクションをとります。
- ON コマンドによって指定されたアクションを実行する。
- 指定された ON アクションの結果を示すように $STATUS と $SEVERITY を設定する。通常は,成功状態に設定される。
- 省略時のエラー・アクション ( エラーまたは重大エラーが生じた場合には終了する ) を再設定する。
ON コマンドの処理は 1 回だけ実行されます。したがって,コマンド・プロシージャが ON コマンドに指定された処理を実行した後,省略時のエラー処理はリセットされます。
ON コマンドによって指定された処理は,コマンドが実行されているコマンド・レベルの内部だけで適用されます。したがって,別のプロシージャを起動するプロシージャの内部で ON コマンドを実行した場合には,ON コマンドの処理は,ネスティングしたプロシージャに適用されません。
ON コマンドの形式は次のとおりです。
ON condition THEN [$] command
|
ただし,condition は次のいずれかのキーワードです。
WARNING
|
コマンド・プロシージャは,警告,エラー,重大エラーが生じたときに指定されたアクションを実行する。
|
ERROR
|
コマンド・プロシージャは,エラーまたは重大エラーが生じたときに指定されたアクションを実行し,警告エラーの場合には処理を継続する。
|
SEVERE_ERROR
|
コマンド・プロシージャは,重大(回復不可能な) エラーが生じたときに指定されたアクションを実行し,警告またはエラーが生じた場合には処理を継続する。
|
特定の重大度レベルに対して ON コマンドの処理が設定された場合には,同じ重大度またはそれより重大度の高いエラーが発生したときに,コマンド・インタプリタは指定された処理を実行します。重大度の低いエラーが発生した場合には,コマンド・インタプリタはファイルの処理を続行します。
例: ON コマンドの使用
このコマンドを使用すれば,省略時のエラー処理を変更して,警告,エラー,または重大なエラーが発生したときに,プロシージャを終了できます。
例: エラー発生後の再開
コマンド・プロシージャにこのコマンドが指定されている場合には,エラーまたは重大なエラーが発生するまで,コマンド・プロシージャは通常どおりに実行されます。
$ ON ERROR THEN GOTO ERR1
|
このようなエラーが発生すると,プロシージャは ERR1 から実行を再開します。 $STATUS と $SEVERITY は正常終了に設定され,省略時のエラー処理はリセットされます。別の ON コマンドまたは SET NOON コマンドが実行される前に, 2 番目のエラーが発生した場合には,プロシージャは終了し,前のコマンド・レベルに戻ります。 ON コマンドで指定されたアクションは,コマンドが実行されているコマンド・レベルでのみ適用されます。したがって,あるプロシージャ内で他のプロシージャを起動するように ON コマンドを使用した場合, ONコマンドのアクションはネストしたプロシージャには及びません。
図 13-1 は,ON コマンド・アクションを図式化しています。
図 13-1 ON コマンドのアクション
- この ON コマンドは,省略時のコマンド・アクション ( 警告の場合は処理を継続し,エラーまたは重大エラーの場合は終了する ) を無効にする。 A.FOR をコンパイル中にエラーまたは重大エラーが生じると,次のコマンドの処理に進む。
- 前の ON コマンドが有効な場合は,省略時のコマンド・アクションに戻るため, A.FOR と B.FOR の両方をコンパイル中にエラーまたは重大エラーが生じると,コマンド・プロシージャは終了する。
- C.FOR をコンパイル中に警告,エラーまたは重大エラーが生じると,コマンド・プロシージャは終了する。
- コマンドの実行前にコマンド・プロシージャが終了していなければ,そのコマンドが実行される。
付録 B のサンプル・コマンド・プロシージャ FORTUSER.COM と CALC.COM は, ON コマンドを使用してエラー処理を設定する方法を示しています。
コマンド・プロシージャの中で SET NOON コマンドを使用すれば,コマンド・インタプリタがコマンドによって戻される状態をチェックしないようにできます。このコマンドは,ON コマンドを NO 状態に設定します。 SET NOON コマンドを使用しても,コマンド・インタプリタは引き続き値を $STATUS と $SEVERITY に収めますが,エラー・チェックは行いません。エラー・チェック機能を再開させるには, SET ON コマンドまたは ON コマンドを使用します。
プロシージャでエラー・チェックが無効に設定されている場合には,コマンドまたはプログラムを実行した後,$STATUS の値を明示的にチェックできます。
次の例では,RUN コマンドの前に SET NOON コマンドが指定されているため,プログラム TESTA のまたは TESTB がエラーを戻した場合には,コマンド・プロシージャは実行を続行します。 SET ON コマンドは,コマンド・インタプリタによる省略時のエラー・チェックを復元します。
$ SET NOON
$ RUN TESTA
$ RUN TESTB
$ SET ON
|
次の例では,最初の IF コマンドは,$STATUS の値が真であるかどうか ( つまり,値が奇数の数値であるかどうか ) を確認します。その場合には,FORTRAN コマンドは正常終了しており,LINK コマンドが実行されます。 LINK コマンドを実行した後,$STATUS が再度テストされます。 $STATUS の値が奇数である場合には,RUN コマンドが実行されます。奇数でない場合には,RUN コマンドは実行されません。 SET ON コマンドは現在の ON 条件処理を復元します。つまり,SET NOON コマンドを実行する前に有効だった条件を復元します。
$ SET NOON
$ FORTRAN MYFILE
$ IF $STATUS THEN LINK MYFILE
$ IF $STATUS THEN RUN MYFILE
$ SET ON
|
SET ON または SET NOON コマンドは,現在のコマンド・レベル,すなわちコマンドを実行するコマンド・レベルにだけ適用されます。別のコマンド・プロシージャを呼び出すコマンド・プロシージャの中で SET NOON コマンドを使用すると,ネストされたプロシージャの中では省略時のエラー・チェック方式が適用されます。 SET NOON は,DCL レベルで会話形式で入力しても意味を持ちません。
省略時の設定では,コマンド・プロシージャの実行中に Ctrl/Y を押すと,コマンド・インタプリタは,Ctrl/Y コマンド・レベルと呼ばれる特別なコマンド・レベルでコマンド入力を求めるプロンプトを出します。 Ctrl/Y コマンド・レベルでは,コマンド・インタプリタ内で実行される DCL コマンドを入力した後, CONTINUE コマンドを入力すれば,コマンド・プロシージャの実行を再開できます。また,コマンド・プロシージャの実行を強制的に終了する DCL コマンドを入力すれば,プロシージャを終了できます。
この節では,ON コマンドを使用することにより,コマンド・プロシージャが Ctrl/Y による割り込みを処理する方法の変更について説明します。
13.11.1 コマンド・プロシージャの中断 | |
会話形式で実行中のコマンド・プロシージャを中断するには,Ctrl/Y を押します。 Ctrl/Y を押すと,コマンド・インタプリタは Ctrl/Y レベルと呼ばれる新しいコマンド・レベルを設定して,コマンド入力を求めるプロンプトを出します。いつ中断が生じるかは,実行中のコマンドまたはプログラムによって異なります。
- コマンドがコマンド・インタプリタ自体によって実行されている場合 ( たとえば,IF,GOTO,割り当て文 ) には,コマンド・インタプリタが Ctrl/Y レベルでコマンドを求めるプロンプトを出す前にコマンドの実行が終了する。
- コマンドまたはプログラムが別のイメージ ( すなわち,コマンド・インタプリタ以外のイメージ ) の場合には,コマンドが中断されてから,コマンド・インタプリタは Ctrl/Y レベルで別のコマンドの入力を求めるプロンプトを出す。
Ctrl/Y レベルでは,コマンド・インタプリタは以前に設定されたすべてのコマンド・レベルの状態を格納するため,Ctrl/Y による中断後に正しい状態を復元できます。
プロシージャの中断後は,次のようにします。
- コマンド・インタプリタの中で実行される DCL コマンドを入力する。
DCL コマンドの中では,SET VERIFY,SHOW TIME,SHOW TRANSLATION,ASSIGN, EXAMINE,DEPOSIT,SPAWN,ATTACH です。これらのコマンドのうちの 1 つ以上を入力すると, CONTINUE コマンドでプロシージャの実行を再開できる。コマンド・インタプリタの中で実行されるコマンドのリストについては, 第 14.7.2 項 を参照すること。 ユーザが CONTINUE コマンドを入力すると,中断されたコマンドやプログラムから,または最も最近に完了したコマンドの後の行からコマンド・プロシージャが再開される。
- 別のイメージを実行する DCL コマンドを入力する。
ユーザが新しいイメージを起動するコマンドを入力すると,コマンド・インタプリタはコマンド・レベル 0 に戻って該当コマンドを実行する。これでコマンド・プロシージャの実行は終了する。新しいイメージを開始する前であれば,中断されたイメージによって宣言されたどの終了ハンドラでも実行できる。
- EXIT または STOP コマンドを入力してコマンド・プロシージャの実行を終了する。
EXIT コマンドを使用した場合は,中断されたイメージによって宣言された終了ハンドラを実行できるが,STOP コマンドはこれらのルーチンを実行しない。
| 注意
Ctrl/Y を押した後に(コマンド・レベルから明示的に,またはONルーチンの一部として) コマンド・プロシージャを終了しない場合,次に入力されるコマンドはこのコマンド・プロシージャのコンテキストの中で解釈されます。たとえば,会話レベルで次のシンボルを定義したとします。
MAIL = "mail/edit=(send,reply,forward)"
|
Ctrl/Y を押して,この定義を含まないコマンド・プロシージャを中断した後, MAIL コマンドを入力してメッセージを送信しても,エディタは自動的には起動されません。
|
13.11.2 特権イメージの中断 | |
特権イメージの実行を中断した場合,このイメージのコンテキストをセーブしたければ,CONTINUE,SPAWN,ATTACH のいずれかのコマンドを入力します。他のコマンドを入力すると ( ユーザが生成または接続したサブプロセスの中から入力する場合を除く ),特権イメージは強制的に終了されます。
これ以降の節では,Ctrl/Y アクション・ルーチンの設定方法を説明します。
|