| 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 | 
|---|