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
>

Reply via email to