前へ | 次へ | 目次 | 索引 |
コマンド・プロシージャ,またはサブルーチンの処理を終了し,呼び出したコマンド・レベル ( コマンド・プロシージャまたは会話型 DCL ) に制御を戻します。また,ユーザが Ctrl/Y を入力した後,イメージを正常終了させます。
EXIT [状態コード]
状態コード
すでに用意されているグローバル・シンボル $STATUS に与える数値を定義します。状態コードには整数,または整数値が求められる式を指定できます。この値は,外側のコマンド・レベルからテストできます。ロングワード整数値の下位 3 ビットは,予約されているグローバル・シンボル $SEVERITY の値を変更します。状態コードを指定する場合,DCL はコンディション・コードとして解釈します。値が偶数の場合には,警告メッセージ,エラー・メッセージおよび重大なエラー・メッセージが作成されます。値が奇数の場合には,正常終了メッセージまたは情報メッセージが作成されます。
状態コードを指定しない場合には,$STATUS の現在の値が保存されます。制御が外側のコマンド・レベルに渡される場合には, $STATUS には最後に実行されたコマンドまたはプログラムの状態が設定されます。
EXIT および STOP コマンドは,ともにプロシージャの実行を終了させる方法を提供します。 EXIT コマンドは,現在のコマンド・プロシージャの実行を終了させ,呼び出し側のコマンド・レベルに制御を戻します。 EXIT コマンドをコマンド・レベル 0 で非会話型プロセス ( バッチ・ジョブなど ) から入力すると,プロセスは終了します。STOP コマンドは,現在のコマンド・レベルにかかわらず,制御をコマンド・レベル 0 に戻します。 STOP コマンドをコマンド・プロシージャまたは非会話型プロセス ( バッチ・ジョブなど ) から実行すると,プロセスは終了します。
DCL コマンド,ユーザ・プログラム,またはコマンド・プロシージャが終了する場合と,コマンド・インタプリタは条件コード値をグローバル・シンボル $STATUS に保存します。EXIT コマンドで明示的に $STATUS の値を設定しないと,コマンド・インタプリタは $STATUS の現在の値を使用してエラー状態を決定します。
$STATUS に含まれる状態値の下位3ビットが,条件の重大度を表します。予約されているグローバル・シンボル $SEVERITY には,条件コードのこの部分が入ります。重大度の値の範囲は,次のように 0 〜 4 です。
値 重大度 0 警告 1 正常終了 2 エラー 3 情報 4 重大な(致命的な)エラー
正常終了および情報のコードは奇数の値,警告およびエラーのコードは偶数の値であることに注意してください。
コマンド・プロシージャが終了し,制御が別のレベルに戻る場合には,コマンド・インタプリタが $STATUS の現在の値をテストします。 $STATUS の値が偶数で,その高位ビットが 0 の場合は,コマンド・インタプリタは, (存在する場合は) その状態コードに対応するシステム・メッセージを表示します。メッセージが存在しない場合は,NOMSG メッセージが表示されます。高位ビットが1の場合,メッセージは表示されません。
DCL コマンドですでに表示された警告またはエラー状態の後でコマンド・プロシージャが終了すると,コマンド・インタプリタは,$STATUS の高位ビットを1にセットします。残りのビットは変更されません。これによって,エラーの原因になったコマンドも,コマンド・プロシージャも,エラー・メッセージを表示しなくなります。
Ctrl/Y でイメージを中断してから EXIT コマンドを使用すると,現在実行中のイメージが正常終了します。イメージに終了処理ルーチンが宣言されていた場合,終了処理ルーチンに制御が移ります。これに対し,STOP コマンドは,終了処理ルーチンを実行しません。このため,通常は STOP コマンドではなく EXIT コマンドを使用してください。
#1 |
---|
$ EXIT 1 |
$STATUS と $SERVERITY に 1 を設定して, 1 つ外側のプロシージャ・レベルに抜けます。
#2 |
---|
$ ON WARNING THEN EXIT $ FORTRAN 'P1' $ LINK 'P1' $ RUN 'P1' |
EXIT コマンドは,ON コマンドの条件成立時のコマンドとして使用されています。このステートメントは,警告またはエラーがプロシージャ内のコマンドから出されたときに,コマンド・プロシージャが必ず終了するようにします。
プロシージャは終了する前に,終了する原因となったコマンドまたはプログラムの状態コードを設定します。
#3 |
---|
$ START: $ IF (P1 .EQS. "TAPE") .OR. (P1 .EQS. "DISK") THEN GOTO 'P1' $ INQUIRE P1 "Enter device (TAPE or DISK)" $ GOTO START $ TAPE: ! Process tape files . . . $ EXIT $ DISK: ! Process disk files . . . $ EXIT |
この例では,コマンド・プロシージャ内で,異なったコマンド・パスを終了させる方法を示しています。このコマンド・プロシージャの実行時には,パラメータに TAPE または DISK を指定します。 IF コマンドは論理 OR を使用して,これらの文字列が入力されたかテストします。結果が真であれば GO TO コマンドは対応するラベルに分岐します。 P1 がTAPE でも DISK でもない場合は,正しいパラメータを入力するよう INQUIRE コマンドが要求します。
ラベル TAPE および DISK に続くコマンドは,パスが異なっています。ラベル DISK の前の EXIT コマンドは,プロシージャが明示的に DISK に分岐した時のみ,ラベル DISK 以降のコマンドが実行されることを保証しています。
プロシージャの終わりでは,自動適に EXIT コマンドが実行されるので,最後の EXIT コマンドは必要ありません。しかし,このように明示的に使用することをおすすめします。
#4 |
---|
$ IF P1. EQS. "" THEN - INQUIRE P1 "Enter filespec (null to exit)" $ IF P1 .EQS. "" THEN EXIT $ PRINT 'P1'/AFTER=20:00/COPIES=50/FORMS=6 |
このコマンド・プロシージャは,パラメータがそのプロシージャに渡されたかどうかをテストします。パラメータが渡されていない場合には,プロシージャは必要なパラメータを要求するプロンプトを表示します。そのあと,パラメータ P1 を再びテストします。データを含まない行を指定するために,キャリッジ・リターンを入力し,パラメータとして空文字列が与えられた場合には,プロシージャは終了します。それ以外の場合には,入力パラメータとして P1 の現在の値を使用して, PRINT コマンドを実行します。
#5 |
---|
$ IF P1 .EQS. "" THEN INQUIRE P1 "Code" $ CODE = %X'P1' $ EXIT CODE |
この例は,システム・ステータス・コードからシステム・メッセージを得る 1 つの方法を示しています。パラメータが 1つ必要で,入力しないと入力するよう要求します。基数演算子 %X を付けてシンボル CODE に代入しています。そして,EXIT コマンドを実行します。たとえば次のように使用します。
$ @E 1C %SYSTEM-F-EXQUOTA, exceeded quota
プロシージャ終了時には,$STATUS には %X1C が代入され,この値は EXQUOTA メッセージに評価されます。または,レキシカル関数 F$MESSAGE を使用しても同様のことができます。
#6 |
---|
$ RUN MYPROG [Ctrl/Y] $ EXIT |
この RUN コマンドは,MYPROG.EXE というイメージの実行を開始します。そのあと,CTRL/Y を使用して実行に割り込みがかけられています。 EXIT コマンドは MYPROG.EXE を終了する前に,イメージによって宣言された終了ハンドラ・ルーチンを呼び出します。
前へ | 次へ | 目次 | 索引 |