文章目录

第三十六章 Caché 命令大全 ZTRAP命令

使用指定的错误代码强制执行错误。

大纲
ZTRAP:pc ztraparg

ZTRAP:pc $ZERROR
ZTRAP:pc $ZE

参数

  • pc - 可选-后置条件表达式。
  • ztraparg 可选-错误代码字符串。错误代码字符串被指定为字符串文字或计算结果为字符串的表达式;仅使用字符串的前四个字符。
  • $ZERROR 特殊变量$ZERROR,可以缩写为$ZE
描述

ZTRAP命令接受命令后置条件和参数间接。 ZTRAP具有三种形式:

  • 无参
  • 字符串参数
  • $ZERROR

不带参数的ZTRAP会强制使用错误代码进行错误。

ZTRAP ztraparg强制执行错误,错误代码为,其中xxxx是ztraparg指定的字符串的前四个字符。如果指定表达式而不是带引号的字符串文字,则编译器将计算该表达式并使用结果字符串的前四个字符。计算表达式时,Caché会从数字中删除加号以及前导和尾随零。 ztraparg的所有其余字符将被忽略。

ZTRAP $ZERROR不会强制出现新错误。它会在当前程序堆栈级别停止执行,并弹出堆栈级别,直到找到另一个错误处理程序为止。然后,使用当前错误代码在该错误处理程序中继续执行。

参数

pc

可选的后置条件表达式。如果后置条件表达式为true(计算为非零数值),则Caché执行命令。如果后置条件表达式为假(计算为零),则Caché不执行命令。

ztraparg

字符串文字或计算结果为字符串的表达式。可以为ztraparg指定以下任何值:

  • 带引号的字符串,任何长度,包含任何字符。 ZTRAP仅使用前四个字符来生成错误代码。如果少于四个字符,则使用提供的字符。与始终为大写的系统错误代码不同,保留了大小写。
    ZTRAP "FRED"  ; generates <ZFRED>
    ZTRAP "Fred"  ; generates <ZFred>
    ZTRAP "Freddy"  ; generates <ZFred>
    ZTRAP "foo"  ; generates <Zfoo>
    ZTRAP " foo"  ; generates <Z foo>
    ZTRAP "@#$%"  ; generates <Z@#$%>
    ZTRAP ""  ; generates <Z>
    ZTRAP """"  ; generates <Z">
  • 计算结果为字符串的表达式。
    ZTRAP 1234  ; generates <Z1234>
    ZTRAP 2+2  ; generates <Z4>
    ZTRAP 10/3  ; generates <Z3.33>
    ZTRAP +0.700  ; generates <Z.7>
    ZTRAP $ZPI  ; generates <Z3.14>
    ZTRAP $CHAR(64)_$CHAR(37)  ; generates <Z@%>
    ZTRAP ""  ; generates <Z>
    ZTRAP """"  ; generates <Z">

ZTRAP命令接受参数间接。

使用$ZERROR将控制传递给错误处理程序

ZTRAP参数是特殊变量$ZERROR时,将执行特殊处理,这在$ZTRAP错误处理程序中很有用。ZTRAP $ZERROR不会强制出现新错误。它会在当前程序堆栈级别停止执行,并弹出堆栈级别,直到找到另一个错误处理程序为止。然后,使用当前错误代码在该错误处理程序中继续执行。此错误处理程序可能位于其他名称空间中。

这种将控制传递给错误处理程序的方法比使用旧版ZQUIT命令更可取。

示例

本示例说明如何将ZTRAP命令与表达式配合使用以产生错误代码:

   ; 此时,例程发现错误 ...
   ZTRAP "ER23"
   ...

当例程运行并且发现预期的错误情况时,输出如下所示:

<ZER23>label+offset^routine

此示例显示后置条件的使用如何影响ZTRAP命令:

   ;
   ZTRAP:y<0 "yNEG"
   ;

当例程运行且y为负时,输出为:

<ZyNEG>label+offset^routine

本示例说明如何在ZTRAP命令中使用参数间接寻址:

   ;
   SET ERPTR="ERMSG"
   SET ERMSG="WXYZ"
   ;
   ;
   ZTRAP @ERPTR

输出为:

<ZWXYZ>label+offset^routine

下面的示例显示一个ZTRAP命令,该命令调用在先前上下文级别定义的$ZTRAP错误陷阱处理程序。

/// d ##class(PHA.TEST.Command).TestZTRAP()
ClassMethod TestZTRAP()
{
Main
	NEW $ESTACK
	s $ZERROR=""
	s $ECODE=""
	
	SET $ZTRAP="OnErr"
	WRITE !,"$ZTRAP set to: ",$ZTRAP
	WRITE !,"Main $ESTACK= ",$ESTACK   // 0
	WRITE !,"Main $ECODE= ",$ECODE," $ZERROR=",$ZERROR
	DO SubA
	WRITE !,"Returned from SubA"   // not executed
	WRITE !,"MainReturn $ECODE= ",$ECODE," $ZERROR=",$ZERROR
	QUIT
SubA
	WRITE !,"SubA $ESTACK= ",$ESTACK   // 1
	ZTRAP 
	WRITE !,"SubA $ECODE= ",$ECODE," $ZERROR=",$ZERROR
	QUIT
OnErr
	WRITE !,"OnErr $ESTACK= ",$ESTACK   // 0
	WRITE !,"OnErr $ECODE= ",$ECODE," $ZERROR=",$ZERROR
	QUIT
}

DHC-APP>d ##class(PHA.TEST.Command).TestZTRAP()
 
$ZTRAP set to: +2022^PHA.TEST.Command.1
Main $ESTACK= 0
Main $ECODE=  $ZERROR=
SubA $ESTACK= 1
OnErr $ESTACK= 0
OnErr $ECODE= ,ZZTRAP, $ZERROR=<ZTRAP>zTestZTRAP+15^PHA.TEST.Command.1