停止トラップの実行
HALT コマンドを発行すると、現在のコンテキストで $HALT がチェックされます。現在のコンテキストに $HALT が定義されていない場合 (存在しないルーチン名または NULL 文字列に設定されている場合)、前のコンテキストにスタックが戻され、そこで $HALT が検索されます。このプロセスは、定義された $HALT が見つかるか、またはスタックが完全に戻されるまで続行されます。InterSystems IRIS では、$HALT の値を使用して、指定された停止トラップ・ルーチンに実行が転送されます。停止トラップ・ルーチンは、$HALT が定義されたコンテキストで実行されます。エラー・コードは設定されず、エラー・メッセージも発行されません。
現在のコンテキストでも前のコンテキストでも有効な $HALT が設定されていない場合、HALT コマンドを発行すると、スタックが完全に戻され、実際のプログラム停止が実行されます。
停止トラップ・ルーチンでは一般に、削除またはレポート処理が実行された後、HALT コマンドが発行されます。定義された $HALT では、元の HALT コマンドによって停止トラップが呼び出されますが、実際のプログラム停止は実行されません。実際の停止を実行するには、停止トラップ・ルーチンに別の HALT コマンドを含める必要があります。
停止トラップ・ルーチンによって発行された HALT コマンドは、その停止トラップではトラップされません。ただし、下位のコンテキスト・レベルで設定された停止トラップでトラップすることができます。そのため、階層式の一連の停止トラップを単独の HALT コマンドで呼び出すことができます。
同様の処理が、エラー・トラップの ZTRAP コマンドと、関連する $ZTRAP または $ETRAP 特殊変数によって実行されます。
例
以下の例は、$HALT を使用して停止トラップを設定します。
SET $HALT="MyTrap^CleanupRoutine"
WRITE !,"the halt trap is: ",$HALT
指定したルーチンが存在するかどうかは、プログラマが確認する必要があります。
次の例は、$HALT が定義されたコンテキストで停止トラップ・ルーチンがどのように実行されるかを示しています。この例では、$HALT が $ESTACK レベル 0 で定義され、HALT が $ESTACK レベル 1 で発行され、停止トラップ・ルーチンが $ESTACK レベル 0 で実行されます。
Main
NEW $ESTACK
SET $HALT="OnHalt"
WRITE !,"Main $ESTACK= ",$ESTACK," $HALT= ",$HALT // 0
DO SubA
WRITE !,"Returned from SubA" // not executed
QUIT
SubA
WRITE !,"SubA $ESTACK= ",$ESTACK," $HALT= ",$HALT // 1
HALT
WRITE !,"this should never display"
QUIT
OnHalt
WRITE !,"OnHalt $ESTACK= ",$ESTACK // 0
HALT
QUIT
次の例は、$HALT が $ESTACK レベル 1 で定義されている点を除き、前の例と同じです。HALT コマンドは $ESTACK レベル 1 で発行され、停止トラップ・ルーチンは $ESTACK レベル 1 で実行されます。停止トラップ・ルーチンによって発行された HALT はスタックを戻しますが、前のコンテキスト・レベルで定義された $HALT が見つからないため、プログラム実行を停止します。そのため、DO コマンドの後に続く WRITE コマンドは実行されません。
Main
NEW $ESTACK
WRITE !,"Main $ESTACK= ",$ESTACK," $HALT= ",$HALT // 0
DO SubA
WRITE !,"Returned from SubA" // not executed
QUIT
SubA
SET $HALT="OnHalt"
WRITE !,"SubA $ESTACK= ",$ESTACK," $HALT= ",$HALT // 1
HALT
WRITE !,"this should never display"
QUIT
OnHalt
WRITE !,"OnHalt $ESTACK= ",$ESTACK // 1
HALT
QUIT
次の例は、階層式の一連の停止トラップを呼び出す方法を示しています。停止トラップ Halt0 は $ESTACK レベル 0 で定義され、停止トラップ Halt1 は $ESTACK レベル 1 で定義されます。HALT コマンドは $ESTACK レベル 2 で発行されます。InterSystems IRIS はスタックを戻し、停止トラップ Halt1 を $ESTACK レベル 1 で呼び出します。この停止トラップは HALT コマンドを発行します。InterSystems IRIS はスタックを戻し、停止トラップ Halt0 を $ESTACK レベル 0 で呼び出します。この停止トラップは、プログラムの実行を停止する HALT コマンドを発行します。
Main
NEW $ESTACK
SET $HALT="Halt0"
WRITE !,"Main $ESTACK= ",$ESTACK," $HALT= ",$HALT // 0
DO SubA
WRITE !,"Returned from SubA" // not executed
QUIT
SubA
SET $HALT="Halt1"
WRITE !,"SubA $ESTACK= ",$ESTACK," $HALT= ",$HALT // 1
DO SubB
WRITE !,"Returned from SubA" // not executed
QUIT
SubB
WRITE !,"SubB $ESTACK= ",$ESTACK," $HALT= ",$HALT // 2
HALT
WRITE !,"this should never display"
QUIT
Halt0
WRITE !,"Halt0 $ESTACK= ",$ESTACK // 0
WRITE !,"Bye-bye!"
HALT
QUIT
Halt1
WRITE !,"Halt1 $ESTACK= ",$ESTACK // 1
HALT
QUIT