Mumps Class 21
From VistApedia
Revision as of 22:36, 30 July 2012 by NeilArmstrong (talk | contribs)
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~|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~|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, <RETURN> 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, <RETURN> 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~|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, <RETURN> 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, <RETURN> 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~|Action]] At M source location ERR+1^KBANERR GTM>ZST INTO DO ERR1 %GTM-I-BREAKZST, Break instruction encountered during ZSTEP [[action~|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~|Action]] At M source location ERR1+1^KBANERR GTM>ZSTEP INTO WRITE 1/0 %GTM-I-BREAKZST, Break instruction encountered during ZSTEP [[action~|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~|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~|Action]] At M source location TRAP1+2^KBANERR GTM>ZST INTO WRITE "$STACK is ",$STACK,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP [[action~|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~|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~|Action]] At M source location DISP+3^KBANERR GTM>ZST INTO $ETRAP is HALT QUIT %GTM-I-BREAKZST, Break instruction encountered during ZSTEP [[action~|Action]] At M source location DISP+4^KBANERR GTM>ZST INTO SET $ECODE="" ; Clear Error %GTM-I-BREAKZST, Break instruction encountered during ZSTEP [[action~|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~|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~|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~|Action]] At M source location CONT+2^KBANERR GTM>ZST INTO WRITE "$STACK is ",$STACK,! %GTM-I-BREAKZST, Break instruction encountered during ZSTEP [[action~|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~|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~|Action]] At M source location DISP+3^KBANERR GTM>ZST INTO $ETRAP is HALT QUIT %GTM-I-BREAKZST, Break instruction encountered during ZSTEP [[action~|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,! %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 ,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>;