第四章 Caché 变量大全 $ETRAP 变量

2021-01-16  本文已影响0人  Cache技术分享

第四章 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特殊变量的值转发到新的DOXECUTE和用户定义的函数上下文中。但是,可以通过发出NEW命令在上下文中创建$ETRAP的新副本,如下所示:

 NEW $ETRAP

每当为$ETRAP发出NEW时,Caché都会执行以下操作:

  1. 保存当时使用的$ETRAP副本。
  2. 创建$ETRAP的新副本。
  3. 为新的$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语言工具之一,能够控制处理和记录应用程序中发生的错误。

$ETRAP$ZTRAP

使用$ZTRAP设置错误处理程序时,此处理程序优先于任何现有的$ETRAP错误处理程序。Caché隐式执行新的$ETRAP命令,并将$ETRAP设置为空字符串(“”)。

$ETRAP 与 TRY / CATCH

TRYCATCH命令在执行级别内执行错误处理。当try块内发生异常时,Caché通常会执行紧跟在try块之后的异常处理程序代码的catch块。

注意:建议在使用try块结构的程序中使用$ETRAP

不能在TRY块内设置$ETRAP。尝试这样做会生成编译错误。可以在TRY块之前或在CATCH块内设置$ETRAP

如果之前设置了$ETRAP,而try块中发生异常,则除非预先阻止这种可能性,否则Caché可能会获取$ETRAP而不是CATCH。如果异常发生时$ETRAPCATCH都存在,则Caché将执行应用于当前执行级别的错误代码(CATCH$ETRAP)。因为$ETRAP本质上与某个执行级别没有关联,所以除非另行指定,否则Caché假定它与当前执行级别关联。在设置$ETRAP以建立$ETRAP的级别标记之前,必须新建$ETRAP,这样Caché才能正确地将CATCH作为当前级别异常处理程序,而不是$ETRAP。否则,系统错误(包括由Throw命令抛出的系统错误)可能会占用$ETRAP异常处理程序。

CATCH块内发生的异常由当前错误陷阱处理程序处理。

上一篇下一篇

猜你喜欢

热点阅读