第十四章 Caché 变量大全 $STACK 变量
包含保存在调用堆栈中的上下文框架的数量。
大纲
$STACK
$ST
描述
$STACK
包含当前保存在进程的调用堆栈中的上下文框架的编号。还可以将$STACK
视为当前正在执行的上下文的从零开始的上下文级别编号。因此,启动Caché JOB
时,在将任何上下文保存到调用堆栈之前,$STACK
的值为零(0)。
每次例程使用DO``命令调用另一个例程时,当前正在执行的例程的上下文都保存在调用堆栈中,并且在新创建的被调用例程的上下文中开始执行。被调用的例程可以依次调用另一个例程,依此类推。每个其他调用都会导致另一个保存的上下文被放置在调用堆栈中。
XECUTE
命令和用户定义的函数引用也将建立新的执行上下文。 GOTO
命令没有。
当通过DO
命令,XECUTE
命令或用户定义的函数引用创建新上下文时,$STACK
的值将递增。当使用QUIT
命令退出上下文时,先前的上下文将从调用堆栈中恢复,并且$STACK
的值递减。
不能使用SET命令修改此特殊变量。尝试这样做会导致<SYNTAX>
错误。
$ESTACK
与$STACK
相同,除了可以通过发出新的$ESTACK
命令在任何时候将$ESTACK
级别设置为0(零)。不能新建$STACK
特殊变量。
错误处理
发生错误时,所有上下文信息将立即保存在程序错误堆栈中。这将更改$STACK
的值。然后,可以使用$STACK
函数访问上下文信息,直到错误处理程序清除$ECODE
的值为止。换句话说,虽然$ECODE
的值非空,但$STACK
函数返回有关错误堆栈中保存的上下文的信息,而不是有关相同指定上下文级别的活动上下文的信息。
终端提示的上下文级别
从程序调用的例程与使用DO
命令从终端提示中调用的例程在不同的上下文级别开始。在终端提示下键入DO
命令将导致创建新的上下文。下面的示例显示了从例程或终端提示中调用的例程START
:
/// d ##class(PHA.TEST.SpecialVariables).STACK()
ClassMethod STACK()
{
START
; 显示上下文级别并退出
WRITE !,"常规START中的上下文级别为 ",$STACK
QUIT
}
- studio
d ##class(PHA.TEST.SpecialVariables).STACK()
常规START中的上下文级别为 8
- terminal
DHC-APP>d ##class(PHA.TEST.SpecialVariables).STACK()
常规START中的上下文级别为 1
示例
下面的示例演示了如何在创建新上下文时增加$STACK
的值,以及在退出上下文时如何减少$STACK
的值。
示例代码如下:
/// d ##class(PHA.TEST.SpecialVariables).STACK1()
ClassMethod STACK1()
{
STA
WRITE !,"例程STA中的上下文级别 = ",$STACK
DO A
WRITE !,"例行程序A之后的上下文级别 = ",$STACK
QUIT
A
WRITE !,"例程A中的上下文级别 = ",$STACK
DO B
WRITE !, "例行程序B之后的上下文级别 = ",$STACK
QUIT
B
WRITE !,"例程B中的上下文级别 = ",$STACK
XECUTE "WRITE !,""XECUTE中的上下文级别 = "",$STACK"
WRITE !,"XECUTE之后的上下文级别 = ",$STACK
QUIT
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).STACK1()
例程STA中的上下文级别 = 1
例程A中的上下文级别 = 2
例程B中的上下文级别 = 3
XECUTE中的上下文级别 = 4
XECUTE之后的上下文级别 = 3
例行程序B之后的上下文级别 = 2
例行程序A之后的上下文级别 = 1
网友评论