Mumps Class 21

 sam@sam-desktop:~$ cd pocn-moh/ sam@sam-desktop:~/pocn-moh$. run_utf8 sam@sam-desktop:~/pocn-moh$ mumps -dir

GTM>; WHY DO ERRORS HAPPEN? WHY WHY???

GTM>; 1. Invalid Syntax (doesn't happen; usually caught by compiler)

GTM>; (except, if you are compiling while executing)

GTM>; 2. Invalid Action (happens a lot!!). E.g. Write 1/0

GTM>; 3. External issue that cuases the process to not be able to continue

GTM>; e.g. Hard disk runs out of space; Transaction is not restartable and s omebody else is playing with the global

GTM>; e.g. You run out of lock space

GTM>; What does error processing do?

GTM>; 1. Try to fix the error to allow normal processing

GTM>; 2. Abandon processing for this block, but resume processing where you left off

GTM>; 3. Record error and stop

GTM>; 4. Just end the process

GTM>; there is no try/catch in Mumps

GTM>; Instead, there is another way of trapping errors, more like VBA

GTM>; Mumps uses $ECODE, $ETRAP, and $ESTACK to process errors.

GTM>; Example of an Error Trap

GTM>zed "ZU"

GTM>zed "XWBTCPM"

GTM>zed "KBANERR"

GTM>zl

GTM>zp SIMPLEERR^KBANERR:SIMPLERR+3 %GTM-E-ZPRTLABNOTFND, Label not found in routine

GTM>ZED

GTM>zp SIMPLEERR^KBANERR:SIMPLEERR+3 SIMPLEERR W 1/0 QUIT

GTM>D SIMPLEERR^KBANERR %GTM-E-DIVZERO, Attempt to divide by zero At M source location SIMPLEERR+1^KBANERR

GTM>ZSHOW SIMPLEERR+1^KBANERR   ($ZTRAP) (Direct mode) +1^GTM$DMOD   (Direct mode)

GTM>D ^%ZTER

GTM>; ^%ZTER logs the error in the VISTA error trap!!!

GTM>; To view the error trap in VISTA, run ^XTER, or the menu option that

GTM>; does that

GTM>D ^XTER

In response to the DATE prompt you can enter: 'S' to specify text to be matched in error or routine name

1 error logged on 4/11/2011 1) <(DIVZERO)>SIMPLEERR+1^KBANERR  09:44:34  EHR,EHR     4851  /dev/pts/3

No screened error

Enter '^' to quit listing,  to continue...: 1

Process ID: 4851  (4851)               APR 11, 2011 09:44:34

UCI/VOL: [EHR,EHR]

$ZA:  0

Current $IO: /dev/pts/3                Current $ZIO: ^0^12^/dev/pts/3

$ZE= SIMPLEERR+1^KBANERR, Attempt to divide by zero,150373210,-%GTM-E-DIVZERO

W 1/0

Which symbol? > ?

Enter: ^Q to EXIT '^' to return to the last question Leading character(s) of symbol(s) you wish to examine ^L to obtain a list of all symbols ^P to select a printer and print this error ^M to capture the current error in a mail message ^I to obtain information on key package variables $ to get a display of the $ system variables

$ZE= SIMPLEERR+1^KBANERR, Attempt to divide by zero,150373210,-%GTM-E-DIVZERO

W 1/0

Which symbol? > ^L

$DEVICE= $ECODE=,M9,Z150373210, $ESTACK=3 $ETRAP= $QUIT=0 $STACK=3 $STACK(000)=-dir $STACK(000,"ECODE")= $STACK(000,"PLACE")=+1^GTM$DMOD $STACK(000,"MCODE")= $STACK(001)=DO $STACK(001,"ECODE")=,M9,Z150373210, $STACK(001,"PLACE")=SIMPLEERR+1^KBANERR $STACK(001,"MCODE")= W 1/0 $STACK(002)= $STACK(002,"ECODE")= $STACK(002,"PLACE")= $STACK(002,"MCODE")= $STACK(003)= Enter '^' to quit listing,  to continue...:

$STACK(003,"ECODE")= $STACK(003,"PLACE")= $STACK(003,"MCODE")= $X $Y=0 12 $ZV=GT.M V5.4-001 Linux x86 %ZT("^XUTL(""XQ"",$J)")= %ZTER11I=EHR,EHR %ZTER11N=1 %ZTER11S= %ZTER11Z=0 %ZTER12A=0 %ZTER12B= %ZTERCNT=32 %ZTERH1=62192 %ZTERROR= %ZTERRT=^%ZTER(1,62192,1,1) %ZTERSUB=%ZTER11S) %ZTERVAP=%ZT( %ZTERVAR=%ZTERVAR %ZTERZE=SIMPLEERR+1^KBANERR, Attempt to divide by zero,150373210,-%GTM-E-DIVZERO

$ZE= SIMPLEERR+1^KBANERR, Attempt to divide by zero,150373210,-%GTM-E-DIVZERO

W 1/0

Which symbol? > ?

Enter: ^Q to EXIT '^' to return to the last question Leading character(s) of symbol(s) you wish to examine ^L to obtain a list of all symbols ^P to select a printer and print this error ^M to capture the current error in a mail message ^I to obtain information on key package variables $ to get a display of the $ system variables

$ZE= SIMPLEERR+1^KBANERR, Attempt to divide by zero,150373210,-%GTM-E-DIVZERO

W 1/0

Which symbol? >

Which error? >

Which date? > GTM>

GTM>; Let's see how Mumps uses Error Traps

GTM>; Mumps executes this code whenever an error happens:

GTM>; X $ERAP

GTM>; QUIT:$QUIT "" QUIT

GTM>ZED

GTM>zed

GTM>D ^TMGIDE

Entering TMG IDE. But first, let's set up an environment... Please type your name: HAB,SMA ??

Please type your name: HAB,SAM HABIEL,SAM M     SMH          THE WIZARD

=
===================================== Welcome to the TMG debugging environment

=
===================================== Options: 1. Start debugger in THIS window. 2. Start debugger CONTROLLER for another Process. 3. Debug, SENDING control to a Controller.

Routine: ^KBANERR (DISP+1^KBANERR)
===============================

Routine: ^KBANERR (DISP+2^KBANERR)
===============================

Routine: ^KBANERR (DISP+3^KBANERR)
===============================

Routine: ^KBANERR (CONT+1^KBANERR)
===============================

Routine: ^KBANERR (CONT+2^KBANERR)
=============================== +8 ; +9 ERR1 ; Create an error, rescue level

Routine: ^KBANERR (ERR+3^KBANERR)
================================   KBANERR +1 KBANERR ; Routine to illustrate Error Trapping ; 4/11/11 9:43am +2 ;; +3 ERR +4 NEW $ETRAP SET $ETRAP="D ^%ZTER" ; Default Error Trap +5 DO ERR1

Routine: ^KBANERR (ERR+4^KBANERR)
================================   KBANERR +1 KBANERR ; Routine to illustrate Error Trapping ; 4/11/11 9:43am +2 ;; +3 ERR +4 NEW $ETRAP SET $ETRAP="D ^%ZTER" ; Default Error Trap +5 DO ERR1 +6 DO ERR2                                                                >+7  QUIT +8 ; +9 ERR1 ; Create an error, rescue level +10 NEW $ETRAP SET $ETRAP="DO TRAP1^KBANERR" 06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)06:53, 24 Apr 2011 (PDT)~ } Action (? for help): step OVER//

$STACK is 7 $ECODE is ,M9,Z150373210, $ETRAP is HALT I have been rescued $STACK is 7 $ECODE is $ETRAP is HALT

(^ to quit) //Leaving TMG debugging environment. Goodbye.

GTM>; What we learned:

GTM>; Mumps executes the error trap upon an error

GTM>; The existence of an error is identified by a non-empty $ECODE

GTM>; You can use Goto(s) (normally a bad programming practice) in processin g errors in order to recover from an error.

GTM>; You can tell Mumps that there is no longer any errro by setting $ECODE to be empty

GTM>zp ^KBANERR KBANERR ; Routine to illustrate Error Trapping ; 4/11/11 9:43am ;; ERR NEW $ETRAP SET $ETRAP="D ^%ZTER" ; Default Error Trap DO ERR1 DO ERR2 QUIT ; ERR1 ; Create an error, rescue level NEW $ETRAP SET $ETRAP="DO TRAP1^KBANERR" ; Dangeous Operation WRITE 1/0 ; End Dangerous Operation CONT WRITE "I have been rescued",! DO DISP QUIT ERR2 ; Create an error, rescue level NEW $ETRAP SET $ETRAP="GOTO TRAP1^KBANERR" ; Dangeous Operation WRITE 1/0 ; End Dangerous Operation WRITE "I have been rescued",! DO DISP QUIT TRAP1 NEW $ETRAP SET $ETRAP="HALT" ; Emergency Error Trap DO DISP SET $ECODE="" ; Clear Error GOTO CONT DISP WRITE "$STACK is ",$STACK,! WRITE "$ECODE is ",$ECODE,! WRITE "$ETRAP is ",$ETRAP,! QUIT SIMPLEERR W 1/0 QUIT

GTM>; $ECODE

GTM>; $ECODE is set by Mumps when an error happens

GTM>; BUT you as a programmer can create your own errors by setting $ECODE

GTM>; $ECODE format

GTM>; ,M#,

GTM>; ,Z#,

GTM>; ,U#,

GTM>SET $ECODE=",U111," %GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap)

GTM>SET $ECODE=",Z111," %GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap)

GTM>SET $ECODE=",M111," %GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap)

GTM>ZSHOW SIMPLEERR+1^KBANERR   ($ZTRAP) (Direct mode) +1^GTM$DMOD   (Direct mode)

GTM>SET $ECODE=",U111," %GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap)

GTM>D ^%ZTER

GTM>ZGT %GTM-E-INVCMD, Invalid command keyword encountered ZGT ^-

GTM>ZGOTO

GTM>D ^XTER

In response to the DATE prompt you can enter: 'S' to specify text to be matched in error or routine name

2 errors logged on 4/11/2011 2) <>                              10:35:44  EHR,EHR     4851  /dev/pts/3  1)  <(DIVZERO)>SIMPLEERR+1^KBANERR  09:44:34  EHR,EHR     4851  /dev/pts/3

No screened error

Enter '^' to quit listing,  to continue...: 2

Process ID: 4851  (4851)               APR 11, 2011 10:35:44

UCI/VOL: [EHR,EHR]

$ZA:  0                                $ZB: \013

Current $IO: /dev/pts/3                Current $ZIO: ^0^15^/dev/pts/3

$ZE= ,,,-

QUIT

Last Global Ref: ^%ZOSF("TRMOFF")

Which symbol? > ^L

$DEVICE= $ECODE=,U111,Z111,M111,U111, $ESTACK=3 $ETRAP= $QUIT=0 $STACK=3 $STACK(000)=-dir $STACK(000,"ECODE")= $STACK(000,"PLACE")=+1^GTM$DMOD $STACK(000,"MCODE")= $STACK(001)=DO $STACK(001,"ECODE")=,U111, $STACK(001,"PLACE")=DISP+4^KBANERR $STACK(001,"MCODE")= QUIT $STACK(002)= $STACK(002,"ECODE")= $STACK(002,"PLACE")= $STACK(002,"MCODE")= $STACK(003)= Enter '^' to quit listing,  to continue...: ^

$ZE= ,,,-

QUIT

Last Global Ref: ^%ZOSF("TRMOFF")

Which symbol? >

Which error? >

Which date? > GTM>; $EC has commas to help you detect the correct error

GTM>W $EC

GTM>S X=",U111,Z111,M111,U111,"

GTM>W X["U11" 1 GTM>W X[",U111," 1 GTM>W X[",U111,," 0 GTM>W X[",U111" 1 GTM>W X[",U11," 0 GTM>; $ESTACK

GTM>; -> $ESTACK tells you how many levels you are in the stack from the l

GTM>; from the last time you newed $ESTACK

GTM>; This helps you unwind the stack until you reach your own level

GTM>; useful will call a lot of other routines and you don't

GTM>; you want to roll back an error that happened in a routine that's

GTM>; far above you.

GTM>; $QUIT

GTM>; $QUIT tells you whether you got called by an extrinsic function or not

GTM>; If you call a routine as a function, $quit is 1

GTM>; if you call it with a Do or Xecute, $quit is 0

GTM>; $STACK

GTM>; $STACK contains the current stack level

GTM>; $STACK(-1) contains the number of levels in the stack

GTM>; $STACK(level,"PLACE/MCODE/ECODE") contains information about

GTM>; the stack

GTM>zed

GTM>zbreak ^KBANERR

GTM>S $ZSTEP="W $T(@$ZPOS),! B"

GTM>ZG

GTM>D ^KBANERR %GTM-I-BREAKZBA, Break instruction encountered during ZBREAK Action At M source location ERR+1^KBANERR

GTM>ZST INTO DO ERR1 %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location ERR+2^KBANERR

GTM>ZSHOW "S" ERR+2^KBANERR (Direct mode) +1^GTM$DMOD   (Direct mode)

GTM>W $STACK 1 GTM>W $STACK(-1) 1 GTM>W $STACK(1) DO GTM>W $STACK(1,"MCODE") DO ERR1 GTM>W $STACK(1,"ECODE")

GTM>W $STACK(1,"PLACE") ERR+2^KBANERR GTM>ZSTEP INTO NEW $ETRAP SET $ETRAP="DO TRAP1^KBANERR" %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location ERR1+1^KBANERR

GTM>ZSTEP INTO WRITE 1/0 %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location ERR1+3^KBANERR

GTM>W $STACK(-1) 2 GTM>; i have 2 level

GTM>W $STACK 2 GTM>; current level is 2

GTM>W $STACK(2) DO GTM>; level 2 called using a DO command

GTM>w $STACK(2,"MCODE") WRITE 1/0 GTM>; current Mumps code

GTM>zst into NEW $ETRAP SET $ETRAP="HALT" ; Emergency Error Trap %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location TRAP1+1^KBANERR

GTM>zshow TRAP1+1^KBANERR (Direct mode) ERR1+3^KBANERR   ($ZTRAP) ERR+2^KBANERR +1^GTM$DMOD   (Direct mode)

GTM>W $STACK(-1) 3 GTM>W $STACK($STACK(-1)-1,"MCODE") WRITE 1/0 GTM>W $STACK($STACK(-1)-1,"ECODE") ,M9,Z150373210, GTM>ZST INTO DO DISP %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location TRAP1+2^KBANERR

GTM>ZST INTO WRITE "$STACK is ",$STACK,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+1^KBANERR

GTM>ZST INTO $STACK is 4 WRITE "$ECODE is ",$ECODE,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+2^KBANERR

GTM>ZST INTO $ECODE is ,M9,Z150373210, WRITE "$ETRAP is ",$ETRAP,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+3^KBANERR

GTM>ZST INTO $ETRAP is HALT QUIT %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+4^KBANERR

GTM>ZST INTO SET $ECODE="" ; Clear Error %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location TRAP1+3^KBANERR

GTM>W $STACK 3 GTM>ZST INTO GOTO CONT %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location TRAP1+4^KBANERR

GTM>ZST INTO WRITE "I have been rescued",! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location CONT+1^KBANERR

GTM>W $STACK 3 GTM>ZST INTO I have been rescued DO DISP %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location CONT+2^KBANERR

GTM>ZST INTO WRITE "$STACK is ",$STACK,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+1^KBANERR

GTM>ZST INTO $STACK is 4 WRITE "$ECODE is ",$ECODE,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+2^KBANERR

GTM>ZST INTO $ECODE is WRITE "$ETRAP is ",$ETRAP,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+3^KBANERR

GTM>ZST INTO $ETRAP is HALT QUIT %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+4^KBANERR

GTM>ZST INTO QUIT %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location CONT+3^KBANERR

GTM>W $STACK 3 GTM>ZP ^KBANERR KBANERR ; Routine to illustrate Error Trapping ; 4/11/11 9:43am ;; ERR NEW $ETRAP SET $ETRAP="D ^%ZTER" ; Default Error Trap DO ERR1 DO ERR2 QUIT ; ERR1 ; Create an error, rescue level NEW $ETRAP SET $ETRAP="DO TRAP1^KBANERR" ; Dangeous Operation WRITE 1/0 ; End Dangerous Operation CONT WRITE "I have been rescued",! DO DISP QUIT ERR2 ; Create an error, rescue level NEW $ETRAP SET $ETRAP="GOTO TRAP1^KBANERR" ; Dangeous Operation WRITE 1/0 ; End Dangerous Operation WRITE "I have been rescued",! DO DISP QUIT TRAP1 NEW $ETRAP SET $ETRAP="HALT" ; Emergency Error Trap DO DISP SET $ECODE="" ; Clear Error GOTO CONT DISP WRITE "$STACK is ",$STACK,! WRITE "$ECODE is ",$ECODE,! WRITE "$ETRAP is ",$ETRAP,! QUIT SIMPLEERR W 1/0 QUIT

GTM>ZST INTO DO ERR2 %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location ERR+3^KBANERR

GTM>W $STACK 1 GTM>ZST INTO NEW $ETRAP SET $ETRAP="GOTO TRAP1^KBANERR" %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location ERR2+1^KBANERR

GTM>ZST INTO WRITE 1/0 %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location ERR2+3^KBANERR

GTM>ZST INTO NEW $ETRAP SET $ETRAP="HALT" ; Emergency Error Trap %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location TRAP1+1^KBANERR

GTM>W $STACK 2 GTM>ZST INTO DO DISP %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location TRAP1+2^KBANERR

GTM>ZST INTO WRITE "$STACK is ",$STACK,! At M source location DISP+1^KBANERR
 * Action]]

GTM>ZST INTO $STACK is 3 WRITE "$ECODE is ",$ECODE,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+2^KBANERR

GTM>ZST INTO $ECODE is ,M9,Z150373210, WRITE "$ETRAP is ",$ETRAP,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+3^KBANERR

GTM>ZST INTO $ETRAP is HALT QUIT %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+4^KBANERR

GTM>ZST INTO SET $ECODE="" ; Clear Error %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location TRAP1+3^KBANERR

GTM>ZST INTO GOTO CONT %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location TRAP1+4^KBANERR

GTM>ZST INTO WRITE "I have been rescued",! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location CONT+1^KBANERR

GTM>ZST INTO I have been rescued DO DISP %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location CONT+2^KBANERR

GTM>W $STACK 2 GTM>ZST INTO WRITE "$STACK is ",$STACK,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+1^KBANERR

GTM>ZST INTO $STACK is 3 WRITE "$ECODE is ",$ECODE,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+2^KBANERR

GTM>ZST INTO $ECODE is WRITE "$ETRAP is ",$ETRAP,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+3^KBANERR

GTM>ZST INTO $ETRAP is HALT QUIT %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location DISP+4^KBANERR

GTM>ZST INTO QUIT %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location CONT+3^KBANERR

GTM>W $STACK 2 GTM>ZST INTO QUIT %GTM-I-BREAKZST, Break instruction encountered during ZSTEP Action At M source location ERR+4^KBANERR

GTM>W $STACK 1 GTM>ZST INTO

GTM>W $STACK 0 GTM>ZED

GTM>; if you cause another error in the error trap

GTM>; TROLLBACK:$TLEVEL QUIT:$QUIT "" QUIT

GTM>; ; correction in the error level

GTM>;