第四章 Caché 变量大全 $ETRAP 变量
第四章 Caché 变量大全 $ETRAP 变量
包含错误发生时要执行的ObjectScript命令字符串。
大纲
$ETRAP
$ET
描述
$ETRAP
包含一个字符串,该字符串指定发生错误时执行的一个或多个ObjectScript命令。
注意:$ETRAP
是可用的对象脚本错误处理工具中最不理想的。不鼓励使用它。
可以使用SET
命令为$ETRAP
提供包含一个或多个对象脚本命令的字符串值。然后,当出现错误时,Caché会执行在$ETRAP
中输入的命令。例如,假设将$ETRAP
设置为一个包含GOTO
命令的字符串,以将控制转移到错误处理例程:
SET $ETRAP="GOTO LOGERR^ERRROU"
Caché然后在$ETRAP
中紧接着产生错误条件的ObjectScript命令执行这个命令。Caché在发生错误情况的同一上下文级别执行$ETRAP
命令。Caché保存$ROLES
值,该值在设置$ETRAP
时生效;当执行$ETRAP
代码时,Caché将$ROLES
设置为保存的值。这可防止$ETRAP
错误处理程序使用在建立错误处理程序后授予例程的提升权限。
当设置$ETRAP
来执行错误处理程序(例如,使用GOTO
命令)时,可以将错误处理程序指定为标签(当前例程中的标签)、^routine
(指定外部例程的开始)或label^routine
(指定外部例程中的指定标签)。
$ETRAP
在某些上下文中支持标签+偏移量(但在程序中不支持)。这个可选的+offset
是一个整数,指定从标签偏移的行数。 InterSystems建议在指定错误处理程序位置时避免使用行偏移量。
SET $ETRAP
字符串的最大长度为32,741个字符。将$ETRAP
设置为更长的字符串可能会导致错误。
$ETRAP
命令与XECUTE
命令的比较
与XECUTE
字符串中的命令不同,$ETRAP
字符串中的命令不会在新的上下文级别中执行。此外,$ETRAP
命令字符串始终由隐式QUIT
命令终止。在需要自变量QUIT
命令的用户定义函数上下文中调用$ETRAP
错误处理命令时,隐式QUIT
命令以空字符串参数退出。
在不同的上下文级别中设置$ETRAP值
默认情况下,Caché将$ETRAP
特殊变量的值转发到新的DO
,XECUTE
和用户定义的函数上下文中。但是,可以通过发出NEW
命令在上下文中创建$ETRAP
的新副本,如下所示:
NEW $ETRAP
每当为$ETRAP
发出NEW
时,Caché都会执行以下操作:
- 保存当时使用的
$ETRAP
副本。 - 创建
$ETRAP
的新副本。 - 为新的
$ETRAP
副本分配与旧的,保存的$ETRAP
副本相同的值。
然后,可以使用SET
命令为$ETRAP
的新副本分配一个不同的值。这样,可以为当前上下文建立新的$ETRAP
错误处理命令。
还可以通过将$ETRAP
设置为空字符串来清除它。然后,如果发生错误,Caché在上下文级别不执行$ETRAP
命令。
当QUIT
命令导致退出当前上下文时,Caché将恢复保存的旧值$ETRAP
。
示例
下面的示例演示如何将$ETRAP
的值传递到新的上下文中,以及如何在发生错误后在每个上下文中再次调用$ETRAP
错误处理命令。在此示例中,$ETRAP
命令不尝试消除该错误。相反,默认情况下,控制会在每个先前的上下文级别传递回$ETRAP
错误处理命令。
/// d ##class(PHA.TEST.SpecialVariables).ETRAP()
ClassMethod ETRAP()
{
ETR
NEW $ETRAP
SET $ETRAP="WRITE !,""$ETRAP invoked at Context Level "",$STACK"
; 启动XECUTE上下文,该上下文启动DO上下文
XECUTE "DO A"
QUIT
; 启动用户定义的函数上下文
A
SET A=$$B
QUIT
;用户定义的函数会产生错误
B()
QUIT 1
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).ETRAP()
$ETRAP invoked at Context Level 2
$ETRAP invoked at Context Level 1
注意
在将$ETRAP
设置为新值之前使用NEW
如果在没有先使用NEW
命令创建$ETRAP
的新副本的情况下为$ETRAP
分配新值,则Caché不仅将当前值而且所有先前的上下文都将该新值建立为$ETRAP
的值。因此,InterSystems建议在将$ETRAP
设置为新值之前,使用NEW $ETRAP
命令创建$ETRAP
的新副本。
$ETRAP
值是一行ObjectScript代码
因为$ETRAP
的字符串值是可执行的ObjectScript命令,所以字符串的长度不能超过ObjectScript例程行的最大长度。
Caché错误处理工具
$ETRAP
特殊变量是几种ObjectScript语言工具之一,能够控制处理和记录应用程序中发生的错误。
- 错误处理的首选Caché功能是块结构的
TRY
和CATCH
命令。 -
$ZTRAP
特殊变量优于$ETRAP
。 -
$ETRAP
将继续是Caché支持的功能。但是,通常应该避免在新代码中使用$ETRAP
,而不是使用其他错误处理工具。
$ETRAP
与 $ZTRAP
使用$ZTRAP
设置错误处理程序时,此处理程序优先于任何现有的$ETRAP
错误处理程序。Caché隐式执行新的$ETRAP
命令,并将$ETRAP
设置为空字符串(“”
)。
$ETRAP 与 TRY / CATCH
TRY
和CATCH
命令在执行级别内执行错误处理。当try
块内发生异常时,Caché通常会执行紧跟在try
块之后的异常处理程序代码的catch
块。
注意:建议在使用try
块结构的程序中使用$ETRAP
。
不能在TRY
块内设置$ETRAP
。尝试这样做会生成编译错误。可以在TRY
块之前或在CATCH
块内设置$ETRAP
。
如果之前设置了$ETRAP
,而try
块中发生异常,则除非预先阻止这种可能性,否则Caché可能会获取$ETRAP
而不是CATCH
。如果异常发生时$ETRAP
和CATCH
都存在,则Caché将执行应用于当前执行级别的错误代码(CATCH
或$ETRAP
)。因为$ETRAP
本质上与某个执行级别没有关联,所以除非另行指定,否则Caché假定它与当前执行级别关联。在设置$ETRAP
以建立$ETRAP
的级别标记之前,必须新建$ETRAP
,这样Caché才能正确地将CATCH
作为当前级别异常处理程序,而不是$ETRAP
。否则,系统错误(包括由Throw
命令抛出的系统错误)可能会占用$ETRAP
异常处理程序。
CATCH块内发生的异常由当前错误陷阱处理程序处理。