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