使用指定的错误代码强制执行错误。
大纲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