| 1 | BPSOSUE ;BHAM ISC/FCS/DRS/FLS - impossible errors ;06/01/2004
 | 
|---|
| 2 |  ;;1.0;E CLAIMS MGMT ENGINE;**1**;JUN 2004
 | 
|---|
| 3 |  Q
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ; Deal with impossible errors (errors which should never occur,
 | 
|---|
| 6 |  ; and which weren't already trapped by M).
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 | IMPOSS(UETYPE,UEOPT,UEMSG,UEMSG2,UELOC,UEROU,UENOLOG) ;EP - deal with impossible errors - called from many places
 | 
|---|
| 9 |  ; $$IMPOSS^BPSOSUE(UETYPE,UEOPT,UEMSG,UELOC,UEROU)
 | 
|---|
| 10 |  ; UETYPE = kinds of problems which may have occured
 | 
|---|
| 11 |  ;     ["FM" a Fileman call has returned an error
 | 
|---|
| 12 |  ;     ["L"  a LOCK with ample time has failed
 | 
|---|
| 13 |  ;     ["DB" a database error (some missing/incorrect field) 
 | 
|---|
| 14 |  ;     ["P"  a programming error / some unexpected condition
 | 
|---|
| 15 |  ;     ["DEV" some kind of device or file error
 | 
|---|
| 16 |  ; UEOPT = options available; first one listed is the default
 | 
|---|
| 17 |  ;     Defaults to "TRI"
 | 
|---|
| 18 |  ;     ["R" retry - retry the operation; log err
 | 
|---|
| 19 |  ;     ["I" ignore - continue as though operation had succeeded; log err
 | 
|---|
| 20 |  ;     ["T" abort - log err and terminate
 | 
|---|
| 21 |  ; UEMSG = optionally, an additional message to output
 | 
|---|
| 22 |  ;    can be .MSG, and we'll walk the array for you.
 | 
|---|
| 23 |  ; UEMSG2 = even more message, like UEMSG.  In a Fileman call failure,
 | 
|---|
| 24 |  ;    you'd probably send   .FDA,.MSG
 | 
|---|
| 25 |  ; UELOC = location, any number or name unique to the calling routine
 | 
|---|
| 26 |  ; UEROU = the name of the calling routine
 | 
|---|
| 27 |  ; UENOLOG = true if you do not want error log entry to be made
 | 
|---|
| 28 |  ;
 | 
|---|
| 29 |  ; $$ returns 1 to retry, 0 to ignore
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 |  ; Caller may do with these values what he desires.
 | 
|---|
| 32 |  ;
 | 
|---|
| 33 |  ; To prevent excessive errors, we won't actually log an error if
 | 
|---|
| 34 |  ; another one has been logged recently.
 | 
|---|
| 35 |  ;
 | 
|---|
| 36 |  ; This routine really isn't as important as it looks.   In fact,
 | 
|---|
| 37 |  ; it will almost never be encountered in practice.  Its existence
 | 
|---|
| 38 |  ; owes mostly to an outrageous ruling made in the name of,
 | 
|---|
| 39 |  ; but contrary to, the very quality and maintainability that forced
 | 
|---|
| 40 |  ; errors give you.  This in turn led to a significant delay 
 | 
|---|
| 41 |  ; in the release of a product which has been proven to be dependable
 | 
|---|
| 42 |  ; in practice. 
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 |  ; Formerly, a zero/zero forced error was found at various places 
 | 
|---|
| 45 |  ; in the code.  In 13 months at ANMC, 11 months at Sitka, 
 | 
|---|
| 46 |  ; and several months at Pawhuska, Wewoka, Santa Fe, and Taos, the
 | 
|---|
| 47 |  ; zero div by zero traps were never encountered, but over $3,000,000
 | 
|---|
| 48 |  ; in revenues were collected.  The ironic thing is,
 | 
|---|
| 49 |  ; without those extra checking, of things like Fileman return values,
 | 
|---|
| 50 |  ; sanity checks on input values, etc., the product would have been
 | 
|---|
| 51 |  ; less reliable, yet it would have sailed through the verifiction
 | 
|---|
| 52 |  ; phase of the project plan.
 | 
|---|
| 53 |  ;
 | 
|---|
| 54 |  ; Forced errors already pervade all of the M language.  <UNDEF> is
 | 
|---|
| 55 |  ; a forced error, for example.  And forced errors are an integral part
 | 
|---|
| 56 |  ; of the design of the very hardware that runs these programs.
 | 
|---|
| 57 |  ; Follow the anti-forced error policy to its logical end and you
 | 
|---|
| 58 |  ; go to Intersleaze and say "stop issuing <UNDEF> and instead,
 | 
|---|
| 59 |  ; prompt the user for the opportunity to continue" and then you go
 | 
|---|
| 60 |  ; to Intel and say "remove the addressing exception trap from your
 | 
|---|
| 61 |  ; microcode; our support organization wouldn't be able to cope with
 | 
|---|
| 62 |  ; the problem report on something like that."
 | 
|---|
| 63 |  ; 
 | 
|---|
| 64 |  I $G(UEOPT)="" S UEOPT="TRI"
 | 
|---|
| 65 |  I $G(ZTQUEUED) S UECHOICE=$E(UEOPT) G QD
 | 
|---|
| 66 |  D:'$D(IOF) HOME^%ZIS ; make sure screen vars there
 | 
|---|
| 67 |  U IO
 | 
|---|
| 68 |  I '$D(IORVON) N IORVON,IORVOFF D
 | 
|---|
| 69 |  . N X S X="IORVON;IORVOFF" D ENDR^%ZISS
 | 
|---|
| 70 |  W !!,IORVON
 | 
|---|
| 71 |  W "An unexpected problem has been detected; notify programmer!"
 | 
|---|
| 72 |  I $D(UELOC)!$D(UEROU) D
 | 
|---|
| 73 |  . W !?5,"The problem occurred "
 | 
|---|
| 74 |  . I $D(UELOC) W "at location ",UELOC," " W:$X>60 !
 | 
|---|
| 75 |  . I $D(UEROU) W "in routine ",UEROU
 | 
|---|
| 76 |  . W ".",!
 | 
|---|
| 77 |  W !?5,"The likely source" W:UETYPE["," "s"
 | 
|---|
| 78 |  W " of such a problem " W $S(UETYPE[",":"are",1:"is"),":",!!?5
 | 
|---|
| 79 |  I UETYPE["FM" D
 | 
|---|
| 80 |  . W "Fileman has reported an error to the program.",!?5
 | 
|---|
| 81 |  I UETYPE["L" D
 | 
|---|
| 82 |  . W "An interlock could not be obtained.",!?5
 | 
|---|
| 83 |  I UETYPE["DB" D
 | 
|---|
| 84 |  . W "An inconsistency in the database was detected.",!?5
 | 
|---|
| 85 |  I UETYPE["DEV" D
 | 
|---|
| 86 |  . W "An error condition trying to open a device or a file.",!?5
 | 
|---|
| 87 |  I UETYPE["P" D
 | 
|---|
| 88 |  . W "A condition the program was unprepared to handle",!?5
 | 
|---|
| 89 |  . W "or perhaps an error in the program logic.",!?5
 | 
|---|
| 90 |  W !,"A programmer should be notified of this unfortunate event.",!
 | 
|---|
| 91 |  D MSG(.UEMSG),MSG(.UEMSG2)
 | 
|---|
| 92 |  W IORVOFF,!!
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 |  N UECHOICE S UECHOICE=$$CHOICE ; Present the options; get I, R, T
 | 
|---|
| 95 | QD ;
 | 
|---|
| 96 |  D LOGERR ; always log an error (unless too soon after prev. error)
 | 
|---|
| 97 |  I UECHOICE="T" G HALT
 | 
|---|
| 98 |  ;LJE;H $R(10)+1 ; could help various things (locks, database conditions)
 | 
|---|
| 99 |  H 2
 | 
|---|
| 100 |  Q:$Q $S(UECHOICE="I":0,UECHOICE="R":1) Q
 | 
|---|
| 101 |  ;
 | 
|---|
| 102 | MSG(X) ; display message, directly or in array
 | 
|---|
| 103 |  I '$D(X) W "X is undefined",! Q
 | 
|---|
| 104 |  I $D(X)#10 W X,!
 | 
|---|
| 105 |  I $D(X)>9 D
 | 
|---|
| 106 |  . N R S R="X" F  S R=$Q(@R) Q:R=""  W @R,!
 | 
|---|
| 107 |  W !
 | 
|---|
| 108 |  Q
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 | CHOICE() ; given UEOPT[letters, UETYPE too
 | 
|---|
| 111 |  I UEOPT="" S UEOPT="T"
 | 
|---|
| 112 |  N DIR,X,Y
 | 
|---|
| 113 |  I $L(UEOPT)=1 S X=UEOPT G CH5
 | 
|---|
| 114 |  S DIR(0)="SM^",X=""
 | 
|---|
| 115 |  I UEOPT["I" S X=X_"I:Ignore the problem and try to continue"
 | 
|---|
| 116 |  I UEOPT["R" S:X]"" X=X_";" S X=X_"R:Retry the operation"
 | 
|---|
| 117 |  I UEOPT["T" S:X]"" X=X_";" S X=X_"T:Terminate the program"
 | 
|---|
| 118 |  I UETYPE'="L" S X=X_" (WE RECOMMEND ""T"")"
 | 
|---|
| 119 |  S DIR(0)=DIR(0)_X
 | 
|---|
| 120 |  S DIR("B")=$E(UEOPT) D ^DIR
 | 
|---|
| 121 | CH5 Q $S(X?1U:X,1:"T")
 | 
|---|
| 122 |  ;
 | 
|---|
| 123 | LOGERR ; log an error
 | 
|---|
| 124 |  ; ^TMP($J,$T(+0),$J)=DUZ^$H last time we did this
 | 
|---|
| 125 |  N X S X=$G(^TMP($J,$T(+0),$J))
 | 
|---|
| 126 |  I $P(X,U)'=DUZ G LOG2
 | 
|---|
| 127 |  S X=$P(X,U,2) I +$H'=+X G LOG2
 | 
|---|
| 128 |  S X=$P(X,",",2) I $P($H,",",2)-X>300 G LOG2
 | 
|---|
| 129 |  I '$G(ZTQUEUED) D
 | 
|---|
| 130 |  . W !,"No additional error log entry will be made at this time.",!
 | 
|---|
| 131 |  Q
 | 
|---|
| 132 | LOG2 ;
 | 
|---|
| 133 |  Q:$G(UENOLOG)  ; requested: no error log entry
 | 
|---|
| 134 |  I '$G(ZTQUEUED) D
 | 
|---|
| 135 |  . W !,"Now recording some error log information to help the programmer...",!
 | 
|---|
| 136 |  D @^%ZOSF("ERRTN") ; trap an error
 | 
|---|
| 137 |  S ^TMP($J,$T(+0),$J)=DUZ_U_$H
 | 
|---|
| 138 |  I '$D(ZTQUEUED) D
 | 
|---|
| 139 |  . W ?10,"..." H 2 W "done.",!
 | 
|---|
| 140 |  Q
 | 
|---|
| 141 | HALT ; halt
 | 
|---|
| 142 |  D H^XUS
 | 
|---|
| 143 |  ; at this point, the user is logged off
 | 
|---|
| 144 |  ; programmer shouldn't reach here, either, if HALT^ZU disinstackifies
 | 
|---|
| 145 |  Q ""  ; <DPARM> error gets you back into programmer mode
 | 
|---|
| 146 | TEST ;
 | 
|---|
| 147 |  N MYEXMSG,I F I=1:1:4 S MYEXMSG(I)="my extra msg line "_I
 | 
|---|
| 148 |  N X S X=$$IMPOSS^BPSOSUE("P","TIR","Additional Message",.MYEXMSG,"point 1","MYROU")
 | 
|---|
| 149 |  W !,"returned value = ",X,!
 | 
|---|
| 150 |  Q
 | 
|---|