包含错误发生时要执行的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命令以空字符串参数退出。
默认情况下,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例程行的最大长度。
$ETRAP特殊变量是几种ObjectScript语言工具之一,能够控制处理和记录应用程序中发生的错误。
TRY和CATCH命令。$ZTRAP特殊变量优于$ETRAP。$ETRAP将继续是Caché支持的功能。但是,通常应该避免在新代码中使用$ETRAP,而不是使用其他错误处理工具。$ETRAP 与 $ZTRAP 使用$ZTRAP设置错误处理程序时,此处理程序优先于任何现有的$ETRAP错误处理程序。Caché隐式执行新的$ETRAP命令,并将$ETRAP设置为空字符串(“”)。
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块内发生的异常由当前错误陷阱处理程序处理。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。