rob wrote:
I've never been a big fan of default handlers. I'd rather the
program halt on the line in error. If the problem is such an
obscure error then often corrective action can be taken elsewhere
and an R to retry fits the bill nicely.
Now, a detailed MONMSG on a particular error is completely
acceptable. By detailed I do not mean
DLTF (MYLIB/MYFILE)
MONMSG CPF0000
I mean
DLTF (MYLIB/MYFILE)
MONMSG CPF2105 /* File not found */
Suggesting that "the developers need to code a generic monitor for
unexpected errors in the application, for which the handler effects
desired notifications" does not imply that poor coding practices should
be introduced. In the above example, the CPF0000 monitor has no
_handler_ and thus misses my point. Consider this more appropriate
coding to effect notification [while avoiding deferral to the language's
default handler, because unexpected messages are being handled]:
QSYS/DLTF FILE(MYLIB/MYFILE) SYSTEM(*LCL) RVMCST(*REMOVE)
MONMSG CPF2105 EXEC(callsubr rmvexcp) /* Ignored expected msg */
MONMSG CPF9999 EXEC(DO) /* Enable DFTPGM() & DMPLST() */
/* optionally callsubr rmvexcp to rid of CPF9999 message */
/* optionally get msgkey from origin for *FC to pass on CALL */
CALL RULES/NOTIFY) /* Notify unexpected msg */
RETURN /* or ENDRQS or SNDPGMMSG *ESCAPE or ?? */
ENDDO /* CPF0000 could've been monitored instead */
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rbam6/monmg.htm
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rbam6/dfthd.htm
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rbam6/esmsg.htm
Specific versus generic monitoring is good coding practice. I agree
that the generic monitor CPF000 for an action in order to ignore a
failed condition is not only poor coding, I also consider that
improperly coded. I also agree and prefer that when an error that is
not directly and specifically monitored in my program [a condition
either not originally considered or one presumed should /never/ occur],
then the language's default inquiry handling is preferable. Preferable
because that stops the program and inquires /on the line in error/, and
best of all for its offering the opportunity to both correct the problem
and then respond with R=Retry to have the program continue. All of that
built-in handling, that I do not need to code myself.
Back to the reply list... Any default handling which does not effect
a desirable result is an apparent coding error, because only the
/desired result/ would meet the business rules. The OP suggested
undesirable results were occurring:
>> Jerry Draper wrote:
>> Issue at this shop is that with the autoreply list set to
>> D)ump all RPG and CPA messages the developer group never
>> really knows when something fails unless the user says
>> something. No one actually reviews qsysopr message queue
>> so all looks fine and dandy.
The generic D=Dump reply being enabled via default System Reply List
reply handling is in effect, a /default handler/. That is, the default
action for an unhandled exception is to inquire but implicitly dump.
I was advocating enforcing what was an alluded business requirement
from the OP, that the applications should effect some explicit
notification of the error versus the default reply handling. Part of
the implied requirement, was that the user should not be able to make
the choice for handling errors, because it was made clear that the users
already fail to report the Dump failures of the application; making them
the arbiter of an inquiry is unlikely to change that behavior. And even
another part of the implied requirement was that an operator is not to
be expected to deal with inquiries nor reviews for failures, since there
is no such entity.
So take the example where the program only handles CPF2105. When the
condition is CPF3202 instead of the monitored CPF2105, the program would
fail with CPF9999 without any coded /default handler/, and the language
will intercept the condition by inquiring for CAP070#. Thus for not
having coded any monitor for the unhandled exception, the application
will be the victim of the inquiry reply handling; either a default reply
from either the message or the system reply list, a user or operator
response, or [unlikely] an exit program's programmed response. As I
understand it, _we_ prefer that the inquiry handling is *RQD and we get
the opportunity to deal with that.
However from the implied requirements from the OP, that is not the
preference. That is, the requirements imply that inquiry handling is
unacceptable because the users can not be trusted and there is no
operator. For that, the application will need to be responsible for
intercepting the unexpected messages, instead of the developer having
allowed the language run-time from intercepting any of those unexpected
messages. Thus the onus is on the developer of the application to code
some handling which effects the desired notification. To achieve that,
the developer could use the generic global monitor CPF0000 to enable
that intercept. The EXEC(CALL RULES/ENFORCE) coded as the handler for
the monitor enables ENFORCEment of the rules which require notification.
This could even include an inquiry implementation that prevents
cancellation by the user, for which resolution by almost anything short
of ENDJOB will require that whomever was notified must investigate
before the job is allowed to continue; not that I am imply such
heavy-handedness is appropriate...
Note: A cancel handler can replace the global monitor, giving the
capability to handle various attempts to cancel the program beyond just
unmonitored errors.
Regards, Chuck
As an Amazon Associate we earn from qualifying purchases.