Most of teh time I do not acticate a signal on Syntax, as REXX provides
enough information by default, and as one gets a traceback.
For the Novalue case: here my handler gives extra information, thge name of
teh variable. If you want a traceback (something I don't need for a
"Novalue" most of the time) I do change my handler
Say 'REXX problem in' myname mytype 'line' sigl
Say 'variable' undefvar 'not defined'
signal CauseLabelTraceBack
Where "CauseLabelTraceBack doesn't exist.
As to code no Error handler and have a signal on Error fro unexpected
RC\=0: I'd prefer clear message instead of "label xxxx not found." What
about
Error:
Say 'Unexpected rc' rc 'from' condition('D')
say 'in' myname mytype 'at line' sigl
exit rc
Kris Buelens,
--- freelance z/VM consultant, Belgium ---
-----------------------------------------------------------------------
2014-04-15 0:54 GMT+02:00 Paul Gilmartin <[email protected]>:
> On 2014-04-14 10:50, Frank M. Ramaekers wrote:
> > I've only done a couple of these before and don't have any good
> > debugging techniques. I've run into a problem on this:
> >
> Reformatting for compactness:
>
> > /* */
> > Trace "O"
> > Signal On Error Name Bad_Error
> > Signal On Syntax Name Bad_Syntax
> > Signal On NoValue Name Bad_NoValue
> >
> I am not much of a fan of all these handlers:
>
> o I am not a devout follower of the Dutchmen's "GOTO considered harmful!"
> but this goes to the other extreme. Rexx's default error handling
> is more legible than a novice is likely to code. But I always code
> "signal on error" and code no handler. It catches inadvertently
> undefined variables; I interpret the traceback, and fix whatever I
> consider a problem. Where I may have deliberately undefined symbols,
> I use the symbol() and value() functions to deal with them. More often,
> I just surround them with apostrophes to make them constants.
>
> > RecNo=0
> > Parse arg OmitRec . "("
> > "PEEKTO Record"
> > Do while rc==0
> > RecNo=RecNo+1
> > If RecNo\==OmitRec then
> > "READTO"
> > If rc\==0 then
> >
> Your handler says you can never get here.
>
> > Exit rc
> > "PEEKTO Record"
> > End /* while */
> >
> OK. You can't possibly fall out of this loop. Have the courage of
> your conviction by supplying "exit 999" or the like here.
>
> > Bad_Error:
> > If rc==12 then
> > rc=0
> > Exit rc
> >
> I think it's more legible to handle errors inline, as you tried to do
> with "If rc\==0 then ...", rather than in a remote handler that one
> must scan forward to see what's happening.
>
> > Bad_Syntax:
> > Exit 13
> >
> I _never_ provide a Syntax handler. All yours does is to suppress the
> traceback which might disclose the point of the error.
>
> > Bad_NoValue:
> > Exit 14
> >
> Your RC=14 is probably coming from here. If you omitted the handler,
> you'd get a traceback that would identify the source of the problem.
>
> > The output looks fine, but it ends up with an RC=14:
> >
> I'll probably get many followups from programmers who take pride in
> their skill at coding condition handlers. I don't care. KISS.
>
> For me, "novalue" always results from a coding error. I accept the
> system default handling and don't attempt recovery.
>
> A fortiori for "syntax".
>
> In sections of code where I don't believe RC<>0 is possible, I sometimes
> wrap "signal on no error", again providing no handler. If Rexx astonishes
> me by terminating on an error, I analyze and fix it.
>
> -- gil
>