$STack()

実行環境のアスペクトを記述する文字列を返します。

$STACK() 関数のフォーマット:

$ST[ACK](intexpr[,expr])
[注意] 注意

$STACK() は、 ""=$ECODE の場合にZSHOW "S"と同様の情報を返しますが、しかし$ECODEにエラー情報が含まれている場合、$STACK() は、前回のエラー時の情報、通常$ ECODEの最初のエントリを返します。$STACK() が現在の情報を返すためには、通常の制御フローを復元する前にエラーハンドリングコードがSET $ECODE=""を行うようにしてください。

$STACK()の例

例:

/usr/lib/fis-gtm/V5.4-002B_x86/gtm -run ^dstackex
dstackex;
  zprint ^dstackex
  write !,$STACK
  xecute "WRITE !,$STACK"
  do Label
  write !,$$ELabel
  write !,$STACK
  quit
 
Label
  write !,$STACK
  do DLabel
  quit
 
ELabel()
  quit $STACK
 
DLabel
  write !,$STACK
  quit
0
1
1
2
1

エラー処理の例:

GTM>zprint ^debugerr
debugerr;
 set dsm1=$stack(-1)
 write !,"$stack(-1):",dsm1
 for l=dsm1:-1:0 do
 . write !,l
 . for i="ecode","place","mcode" write ?5,i,?15,$stack(l,i),!
GTM>

上記の例は、エラーを引き起こしたコードパスのトレースを表示するために使用できます。

例:

GTM>zprint ^dstacktst
dstacktst(x)       ; check $stack() returns with and without clearing $ecode
 set $etrap="do ^debugerr"
label
 if x>0 set $ecode=",U1," ; if condition
 else  set $ecode=",U2," ;  else condition
 quit
GTM>do ^dstacktst(0)
$stack(-1):2
2    ecode
     place     debugerr+3^debugerr
     mcode      for l=dsm1:-1:0 do
1    ecode     ,U2,
     place     label+2^dstacktst
     mcode      else  set $ecode=",U2," ;  else condition
0    ecode
     place     +1^GTM$DMOD
     mcode
%GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap)
GTM>do ^dstacktst(1)
$stack(-1):1
1    ecode     ,U2,
     place     label+2^dstacktst
     mcode      else  set $ecode=",U2," ;  else condition
0    ecode
     place     +1^GTM$DMOD
     mcode
%GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap)
GTM>set $ecode=""
GTM>do ^dstacktst(1)
$stack(-1):2
2    ecode
     place     debugerr+3^debugerr
     mcode      for l=dsm1:-1:0 do
1    ecode     ,U1,
     place     label+1^dstacktst
     mcode      if x>0 set $ecode=",U1," ; if condition
0    ecode
     place     +1^GTM$DMOD
     mcode
%GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap)
GTM>

次の例は、SET $ECODE=.. で$STACK() が現在の情報を報告する方法を示しています。その間に $ECODE をクリアせずに do ^dstacktst(0) と do ^dostacktst(0) を実行すると、最初のエラー時に凍結された情報(else条件)を表示する方法に注目してください。

inserted by FC2 system