美文网首页
第四章 Caché 变量大全 $ETRAP 变量

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

作者: Cache技术分享 | 来源:发表于2021-01-16 07:14 被阅读0次

    第四章 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语言工具之一,能够控制处理和记录应用程序中发生的错误。

    • 错误处理的首选Caché功能是块结构的TRYCATCH命令。
    • $ZTRAP特殊变量优于$ETRAP
    • $ETRAP将继续是Caché支持的功能。但是,通常应该避免在新代码中使用$ETRAP,而不是使用其他错误处理工具。

    $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块内发生的异常由当前错误陷阱处理程序处理。

    相关文章

      网友评论

          本文标题:第四章 Caché 变量大全 $ETRAP 变量

          本文链接:https://www.haomeiwen.com/subject/ubngaktx.html