第六十四章 Caché 函數大全 $STACK 函數
返回有關保存在流程調用堆棧中的活動上下文的信息。
大綱
$STACK(context_level,code_string)
$ST(context_level,code_string)
參數
- context_level 一個整數,指定要爲其請求信息的上下文的從零開始的上下文級別編號。支持的值包括0,正整數和-1。
- code_string 可選-關鍵字字符串,指定所請求的上下文信息的類型。支持的值爲
“PLACE”
,“MCODE”
和“ECODE”
描述
$STACK
函數根據$ECODE
特殊變量的值返回有關當前執行堆棧或當前錯誤堆棧的信息。 $STACK
最常用於在當前執行棧(也稱爲流程調用棧)上返回信息。
每次例程調用DO
命令,XECUTE
命令或用戶定義的函數(但不是GOTO
命令)時,當前正在執行的例程的上下文都會保存在調用堆棧中,並且在新創建的例程上下文中開始執行稱爲例行程序。反過來,被調用的例程可以調用另一個例程,依此類推,導致將更多保存的上下文放置在調用堆棧中。
$STACK
函數返回有關保存在流程調用堆棧中的這些活動上下文的信息。 $STACK
還可以返回有關當前正在執行的上下文的信息。但是,在錯誤處理期間,$STACK
返回當應用程序中發生錯誤時所有可用上下文信息的快照。
可以使用$STACK
特殊變量來確定當前上下文級別。
$ECODE
與 $STACK
$STACK
返回的值取決於$ECODE
特殊變量。如果清除$ECODE
(設置爲空字符串),則$STACK
返回當前執行堆棧。如果$ECODE
包含非空值,則$STACK
返回當前錯誤堆棧。
僅當$ECODE
特殊變量包含非空值時,錯誤堆棧上下文信息纔可用。當發生錯誤或將$ECODE
顯式設置爲非空值時,可能會發生這種情況。在這種情況下,$STACK
返回有關錯誤堆棧上下文的信息,而不是有關指定上下文級別的活動堆棧上下文的信息。
當錯誤堆棧上下文信息不可用($ECODE =“”
)且使用$STACK
的兩個參數形式指定當前上下文級別時,Caché返回有關當前正在執行的命令的信息。爲了確保訪問當前執行堆棧時的行爲一致,請在調用$STACK
之前指定SET $ECODE =“”
。
$STACK
的單參數形式
$STACK(context_level)
返回一個字符串,該字符串指示如何建立指定的上下文級別。下表描述了可以返回的字符串值:
-
DO
通過DO
命令建立指定的上下文時返回。 -
XECUTE
通過XECUTE
命令或BREAK
命令建立指定的上下文時返回。 -
$$
通過用戶定義的函數引用建立指定的上下文時返回。 - An ECODE string 導致將指定上下文添加到錯誤堆棧的錯誤的錯誤代碼值。例如,,
M26
。當在已經發生錯誤的上下文級別上發生錯誤時,上下文信息將放在下一個更高的錯誤堆棧級別;僅當指定的錯誤堆棧上下文級別的上下文信息已重定位信息時,才返回它。
當指定的上下文級別爲零(0)或未定義時,$STACK
返回空字符串。
還可以使用$STACK
函數的單參數形式爲上下文級別指定-1。在這種情況下,$STACK
返回可用信息的最大上下文級別,該信息在正常處理期間是當前正在執行的上下文的上下文級別編號。但是,在錯誤處理期間,$STACK(-1)
返回較大值:
- 過程錯誤堆棧的最大上下文級別
- 當前執行上下文的上下文級別號
$STACK
的兩個參數形式
$STACK(context_level,code_string))
根據指定的code_string
返回有關指定上下文級別的信息。必須將code_string
指定爲帶引號的字符串。 code_string
值不區分大小寫。例如,$STACK(1,"PLACE")
或 $STACK(1,"place")
。
以下描述了代碼字符串以及在指定每個字符串時返回的信息。
-
PLACE
—返回在指定上下文級別執行的最後一個命令的條目引用和命令編號。對於DO
和用戶定義的函數上下文,將以以下格式返回該值:“ label [+ offset] [^例程名稱] + command”
。對於XECUTE
上下文,使用以下格式:“ @ + command”
。 -
MCODE
—返回源例程行,XECUTE
字符串或$ETRAP
字符串,其中包含在指定上下文級別執行的最後一個命令。 (常規行的返回方式與$TEXT
函數返回的方式相同。)
注意:在錯誤處理期間,如果在構建或更新錯誤堆棧時內存不足,則可能沒有足夠的內存來存儲源代碼行。在這種情況下,MCODE
代碼字符串的返回值爲空字符串。但是,PLACE
代碼字符串的返回值指示位置。
-
ECODE
—在指定上下文級別發生的任何錯誤的錯誤代碼(僅在錯誤堆棧上下文中可用)。
當請求的信息在指定的上下文級別不可用時,$STACK
的兩個參數形式將返回空字符串。
示例
下面的示例演示$STACK
可以返回的一些信息:
STAC ;
SET $ECODE=""
XECUTE "DO First"
QUIT
First
SET varSecond=$$Second()
QUIT
Second()
FOR loop=0:1:$STACK(-1) {
WRITE !,"Context level:",loop,?25,"Context type: ",$STACK(loop)
WRITE !,?5,"Current place: ",$STACK(loop,"PLACE")
WRITE !,?5,"Current source: ",$STACK(loop,"MCODE")
WRITE !
}
QUIT 1
DHC-APP>d STAC^PHA.TEST.Command
Context level:0 Context type:
Current place: @ +1
Current source: D STAC^PHA.TEST.Command
Context level:1 Context type: DO
Current place: STAC+2^PHA.TEST.Command +1
Current source: XECUTE "DO First"
Context level:2 Context type: XECUTE
Current place: @ +1
Current source: DO First
Context level:3 Context type: DO
Current place: First+1^PHA.TEST.Command +1
Current source: SET varSecond=$$Second()
Context level:4 Context type: $$
Current place: Second+3^PHA.TEST.Command +4
Current source: WRITE !,?5,"Current source: ",$STACK(loop,"MCODE")
打印堆棧信息
FOR loop=0:1:$STACK(-1) {
WRITE !,"Context level:",loop,?25,"Context type: ",$STACK(loop)
WRITE !,?5,"Current place: ",$STACK(loop,"PLACE")
WRITE !,?5,"Current source: ",$STACK(loop,"MCODE")
WRITE !
}
注意
跨命名空間的例行調用
如果例程在其他名稱空間中調用例程,則$STACK
返回名稱空間名稱作爲例程名稱的一部分。例如,如果USER
名稱空間中的例程調用SAMPLES
名稱空間中的例程,則$STACK
返回 ^|“ SAMPLES” |
例程名稱。
$STACK
使用尖號(^
)字符作爲分隔符。因此,如果隱含的名稱空間名稱包含插入符號(^
)字符,則Caché將此名稱空間名稱字符顯示爲@
字符。
$STACK
計算多個參數的命令
指定多參數命令時,命令計數包括命令關鍵字和除第一個以外的所有命令參數。考慮以下多參數命令:
TEST
SET X=1,Y=Z
在Caché中,由於Y = Z
參數被視爲單獨的命令,因此$STACK
語句$STACK(1,“ PLACE”)
返回"TEST^TEST +2"
。
出現<STORE>
錯誤或內存不足的$STACK
在出現<STORE>
錯誤或在內存不足的情況下,可能無法通過應用$STACK
的兩個參數形式正常獲取信息。