Introduced in the 1995 ANSI M[UMPS] language standard.
This function returns information extracted from the error-trap status information stack.
Assume that a routine called T4EDM exists, with the following code:
T4EDM ; test error trapping
X WRITE !,"Start test routine, $STACK=",$STACK
WRITE ", $ESTACK=",$ESTACK
SET $ECODE="",SHOWN=0
DO L1
WRITE !,"At end of routine, $STACK=",$STACK
WRITE ", $ESTACK=",$ESTACK
QUIT
L1 WRITE !,"Now at label L1, $STACK=",$STACK
WRITE ", $ESTACK=",$ESTACK
SET $ETRAP="w !,""Error trap from L1 ("",$STACK,""/"",$ESTACK,"")."" DO E1 DO SHOW($STACK)"
DO L2
SET SHOWN=0
w !,"NOTE: The error trap should have ended here."
w !,"Now let's generate a user-defined error:"
SET $ECODE=",User defined error,"
w !,"Now leaving subroutine L1, $STACK=",$STACK
w ", $ESTACK=",$ESTACK
QUIT
L2 NEW $ESTACK,$ETRAP
WRITE !,"Now at label L2, $STACK=",$STACK
WRITE ", $ESTACK=",$ESTACK
s $et="w !,""Error trap from L2 ("",$STACK,""/"",$ESTACK,"")."" do E2 s:'$ESTACK $ECODE="""" DO SHOW($STACK)"
DO L3
WRITE !,"Now leaving subroutine L2, $STACK=",$STACK
WRITE ", $ESTACK=",$ESTACK
QUIT
L3 WRITE !,"Now at label L3, $STACK=",$STACK
WRITE ", $ESTACK=",$ESTACK
SET X="w !,""Now comes the error:"" set A=1/0"
SET Y="xecute X"
SET A="x Y"
XECUTE A
WRITE !,"Now leaving subroutine L3, $STACK=",$STACK
WRITE ", $ESTACK=",$ESTACK
QUIT
E1 WRITE " E1 ",$ECODE,! DO TRACE QUIT
E2 WRITE " E2 ",$ECODE,! DO TRACE QUIT
TRACE NEW MAX,I,K,HERE
QUIT:SHOWN
SET MAX=$STACK(-1),HERE=$STACK
FOR K=0:1:MAX DO
. WRITE !,$SELECT(HERE=K:" * ",1:" "),$JUSTIFY(K,2),": ",$STACK(K)
. FOR I="PLACE","MCODE","ECODE" W !?9,$STACK(K,I)
. QUIT
SET SHOWN=1
QUIT
SHOW(N) WRITE !,"In show, N=",N,",$STACK=",$STACK
QUIT
Execution of this routine will yield the following result:
do X
Start test routine, $STACK=1, $ESTACK=1
Now at label L1, $STACK=2, $ESTACK=2
Now at label L2, $STACK=3, $ESTACK=0
Now at label L3, $STACK=4, $ESTACK=1
Now comes the error:
Error trap from L2 (7/4). E2 ,M9,
0:
@ +1
do X
1: DO
X+3^T4EDM +1
DO L1
2: DO
L1+3^T4EDM +1
DO L2
3: DO
L2+4^T4EDM +1
DO L3
4: DO
L3+5^T4EDM +1
XECUTE A
5: XECUTE
@ +1
x Y
6: XECUTE
@ +1
xecute X
7: XECUTE
@ +2
w !,"Now comes the error:" set A=1/0
,M9,
8: DO
E2^T4EDM +2
E2 WRITE " E2 ",$ECODE,! DO TRACE QUIT
* 9: DO
TRACE+3^T4EDM +2
FOR K=0:1:MAX DO
In show, N=7, $STACK=8
Error trap from L2 (6/3). E2 ,M9,
In show, N=6, $STACK=7
Error trap from L2 (5/2). E2 ,M9,
In show, N=5, $STACK=6
Error trap from L2 (4/1). E2 ,M9,
In show, N=4, $STACK=5
Error trap from L2 (3/0). E2 ,M9,
In show, N=3, $STACK=4
NOTE: The error trap should have ended here.
Now let's generate a user-defined error:
Error trap from L1 (2/2). e1 ,User defined error,.
0:
@ +1
do X
1: DO
X+3^T4EDM +1
DO L1
2: DO
L1+7^T4EDM +1
SET $ECODE=",User defined error,"
,User defined error,
3: DO
E1^T4EDM +2
E1 WRITE " E1 ",$ECODE,! DO TRACE QUIT
* 4: DO
TRACE+3^T4EDM +2
FOR K=0:1:MAX DO
In show, N=2, $STACK=3
Error trap from L1 (1/1). E1 ,User defined error,
In show, N=1, $STACK=2
Error trap from L1 (0/0). E1 ,User defined error,
In show, N=0, $STACK=1
Now, let s have a look at the stacking of variables and error-traps.
Assume that a routine called T1EDM exists, with the
following code:
T1EDM ; WRITE "Start: $STACK = ",$STACK WRITE ", $ECODE = """,$ECODE,"""," WRITE !?5,"$ETRAP = """,$ETRAP WRITE """, $ESTACK = ",$ESTACK,! SET LEVEL=1 SET $ETRAP="GOTO ERROR" DO X QUIT ; X IF LEVEL#3=0 NEW $ESTACK IF LEVEL#4=0 NEW LOCAL SET LOCAL(LEVEL)=LEVEL SET LOCAL(LEVEL,LEVEL)="Demo" IF LEVEL=16 NEW $ETRAP SET $ETRAP="GOTO NESTERR" WRITE !,"Level = ",LEVEL WRITE ", $STACK = ",$STACK WRITE ", $ECODE = """,$ECODE,"""," WRITE !?5,"$ETRAP = """,$ETRAP WRITE """, $ESTACK = ",$ESTACK,! SET LEVEL=LEVEL+1 IF LEVEL<20 DO X ELSE SET $ECODE=",U13," ; User defined error code WRITE !!,"Back: level = ",LEVEL WRITE ", $STACK = ",$STACK WRITE ", $ECODE = """,$ECODE,"""," WRITE !?5,"$ETRAP = """,$ETRAP WRITE """, $ESTACK = ",$ESTACK,! QUIT ; ERROR WRITE !!,"Error: level = ",LEVEL WRITE ", $STACK = ",$STACK WRITE ", $ECODE = """,$ECODE,"""," WRITE !?5,"$ETRAP = """,$ETRAP WRITE """, $ESTACK = ",$ESTACK WRITE !,"Error location: """ WRITE $STACK($STACK,"PLACE"),"""." WRITE !,"MUMPS code: """ WRITE $STACK($STACK,"MCODE"),"""." WRITE !,"Error code: """ WRITE $STACK($STACK,"ECODE"),"""." SET R="LOCAL" FOR SET R=$QUERY(@R) QUIT:R="" DO . WRITE !,R," = ",@R . QUIT ; IF $STACK<7 SET $ECODE="" ; ; As long as the value of $ECODE is ; non-empty, the system will execute ; the error trap upon exit from the ; error trap routine. QUIT ; NESTERR ; WRITE !,"Nested error trap" WRITE ", $STACK = ",$STACK QUIT
Then the command DO ^T1EDM will produce the following result:
Start: $STACK = 1, $ECODE = "",
$ETRAP = "", $ESTACK = 1
Level = 1, $STACK = 2, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 2
Level = 2, $STACK = 3, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 3
Level = 3, $STACK = 4, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 0
Level = 4, $STACK = 5, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 1
Level = 5, $STACK = 6, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 2
Level = 6, $STACK = 7, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 0
Level = 7, $STACK = 8, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 1
Level = 8, $STACK = 9, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 2
Level = 9, $STACK = 10, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 0
Level = 10, $STACK = 11, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 1
Level = 11, $STACK = 12, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 2
Level = 12, $STACK = 13, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 0
Level = 13, $STACK = 14, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 1
Level = 14, $STACK = 15, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 2
Level = 15, $STACK = 16, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 0
Level = 16, $STACK = 17, $ECODE = "",
$ETRAP = "GOTO NESTERR", $ESTACK = 1
Level = 17, $STACK = 18, $ECODE = "",
$ETRAP = "GOTO NESTERR", $ESTACK = 2
Level = 18, $STACK = 19, $ECODE = "",
$ETRAP = "GOTO NESTERR", $ESTACK = 0
Level = 19, $STACK = 20, $ECODE = "",
$ETRAP = "GOTO NESTERR", $ESTACK = 1
Nested error trap, $STACK = 20
Nested error trap, $STACK = 19
Nested error trap, $STACK = 18
Nested error trap, $STACK = 17
Error: level = 20, $STACK = 16, $ECODE = ",U13,",
$ETRAP = "GOTO ERROR", $ESTACK = 0
Error location: "X+10^T1EDM +2".
MUMPS code: " IF LEVEL<20 D X".
Error code: "".
LOCAL(12) = 12
LOCAL(12,12) = Demo
LOCAL(13,13) = Demo
LOCAL(14,14) = Demo
LOCAL(15,15) = Demo
Error: level = 20, $STACK = 15, $ECODE = ",U13,",
$ETRAP = "GOTO ERROR", $ESTACK = 2
Error location: "X+10^T1EDM +2".
MUMPS code: " IF LEVEL<20 D X".
Error code: "".
LOCAL(12) = 12
LOCAL(12,12) = Demo
LOCAL(13,13) = Demo
LOCAL(14,14) = Demo
LOCAL(15,15) = Demo
Error: level = 20, $STACK = 14, $ECODE = ",U13,",
$ETRAP = "GOTO ERROR", $ESTACK = 1
Error location: "X+10^T1EDM +2".
MUMPS code: " IF LEVEL<20 D X".
Error code: "".
LOCAL(12) = 12
LOCAL(12,12) = Demo
LOCAL(13,13) = Demo
LOCAL(14,14) = Demo
LOCAL(15,15) = Demo
Error: level = 20, $STACK = 13, $ECODE = ",U13,",
$ETRAP = "GOTO ERROR", $ESTACK = 0
Error location: "X+10^T1EDM +2".
MUMPS code: " IF LEVEL<20 D X".
Error code: "".
LOCAL(12) = 12
LOCAL(12,12) = Demo
LOCAL(13,13) = Demo
LOCAL(14,14) = Demo
LOCAL(15,15) = Demo
Error: level = 20, $STACK = 12, $ECODE = ",U13,",
$ETRAP = "GOTO ERROR", $ESTACK = 2
Error location: "X+10^T1EDM +2".
MUMPS code: " IF LEVEL<20 D X".
Error code: "".
LOCAL(8) = 8
LOCAL(8,8) = Demo
LOCAL(9,9) = Demo
LOCAL(10,10) = Demo
LOCAL(11,11) = Demo
Error: level = 20, $STACK = 11, $ECODE = ",U13,",
$ETRAP = "GOTO ERROR", $ESTACK = 1
Error location: "X+10^T1EDM +2".
MUMPS code: " IF LEVEL<20 D X".
Error code: "".
LOCAL(8) = 8
LOCAL(8,8) = Demo
LOCAL(9,9) = Demo
LOCAL(10,10) = Demo
LOCAL(11,11) = Demo
Error: level = 20, $STACK = 10, $ECODE = ",U13,",
$ETRAP = "GOTO ERROR", $ESTACK = 0
Error location: "X+10^T1EDM +2".
MUMPS code: " IF LEVEL<20 D X".
Error code: "".
LOCAL(8) = 8
LOCAL(8,8) = Demo
LOCAL(9,9) = Demo
LOCAL(10,10) = Demo
LOCAL(11,11) = Demo
Error: level = 20, $STACK = 9, $ECODE = ",U13,",
$ETRAP = "GOTO ERROR", $ESTACK = 2
Error location: "X+10^T1EDM +2".
MUMPS code: " IF LEVEL<20 D X".
Error code: "".
LOCAL(8) = 8
LOCAL(8,8) = Demo
LOCAL(9,9) = Demo
LOCAL(10,10) = Demo
LOCAL(11,11) = Demo
Error: level = 20, $STACK = 8, $ECODE = ",U13,",
$ETRAP = "GOTO ERROR", $ESTACK = 1
Error location: "X+10^T1EDM +2".
MUMPS code: " IF LEVEL<20 D X".
Error code: "".
LOCAL(4) = 4
LOCAL(4,4) = Demo
LOCAL(5,5) = Demo
LOCAL(6,6) = Demo
LOCAL(7,7) = Demo
Error: level = 20, $STACK = 7, $ECODE = ",U13,",
$ETRAP = "GOTO ERROR", $ESTACK = 0
Error location: "X+10^T1EDM +2".
MUMPS code: " IF LEVEL<20 D X".
Error code: "".
LOCAL(4) = 4
LOCAL(4,4) = Demo
LOCAL(5,5) = Demo
LOCAL(6,6) = Demo
LOCAL(7,7) = Demo
Error: level = 20, $STACK = 6, $ECODE = ",U13,",
$ETRAP = "GOTO ERROR", $ESTACK = 2
Error location: "X+10^T1EDM +2".
MUMPS code: " IF LEVEL<20 D X".
Error code: "".
LOCAL(4) = 4
LOCAL(4,4) = Demo
LOCAL(5,5) = Demo
LOCAL(6,6) = Demo
LOCAL(7,7) = Demo
Back: level = 20, $STACK = 5, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 1
Back: level = 20, $STACK = 4, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 0
Back: level = 20, $STACK = 3, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 3
Back: level = 20, $STACK = 2, $ECODE = "",
$ETRAP = "GOTO ERROR", $ESTACK = 2
This document is © Ed de Moel, 1995-2005.
It is part of a book by Ed de Moel that is published under
the title "M[UMPS] by Example" (ISBN 0-918118-42-5).
Printed copies of the book are no longer available.