Hi, Greg, Sunanda, et al...

Gregg Irwin wrote:
> 
> > -- I write some code that calls something from your site
> > that calls something from someone else's. And at some point
> > it crashes with an "Error near a / b".
> >
> > Is that my code or yours or the other person's or a Rebol-
> > supplied mezzanine function? I don't care how un-purist it
> > is to expect the call stack to be printed. But I need it at
> > this point or the application is dead in the water.
> 
> I think this points out that we, as REBOL developers, need to
> take into account the context in which our code is intended to
> be used. I can appreciate being able to write simple reblets
> that are self-contained and often times may get by with a
> minimum of error handling and formal design.
>
> If you are writing code to be used in distributed applications,
> you darn well better have everything error trapped and be as
> helpful as possible when it comes to tracking down errors. I
> think Design by Contract will be enormously helpful in that
> regard but I haven't had time to work up a dialect implementing
> it yet.
> 

Let's not forget what REBOL alreay provides, which most of us
(myself included) probably don't use to full benefit.  Pretend
that I have some REBOL source files from elsewhere:

8<----"buggyfunc.r"---------------------------------------------
REBOL []

buggyfunc: func [a [integer!] b [integer!]] [a / b]
8<--------------------------------------------------------------

and

8<----"buggywrap.r"---------------------------------------------
REBOL []

buggywrap: func [n [integer!] /local r]
[   r: copy []
    either even? n
    [   repeat i n [append r 5040 / i]]
    [   repeat i n [append r 5040 / (8 - i)]]
    r
]
8<--------------------------------------------------------------

and now I want to use those bits of scriptage myself.

I can write:

8<----"buggytest.r"---------------------------------------------
REBOL []

do %buggyfunc.r
do %buggywrap.r

testbug: func [n [integer!] /local r]
[   either error? r: try [buggywrap n]
    [   print ["Oops!  buggywrap blew up when called with" n "!"]]
    [   print ["Pretend to do something useful" newline tab mold r]]
]
8<--------------------------------------------------------------

which wraps the "untrusted" code in a TRY evaluation to let me
know whether (and under what circumstances) the foreign code may
cough and die.

    >> do %buggytest.r
    >> testbug 5
    Pretend to do something useful
         [720 840 1008 1260 1680]
    >> testbug 6
    Pretend to do something useful
         [5040 2520 1680 1260 1008 840]
    >> testbug 7
    Pretend to do something useful
         [720 840 1008 1260 1680 2520 5040]
    >> testbug 8
    Pretend to do something useful
         [5040 2520 1680 1260 1008 840 720 630]
    >> testbug 9
    Oops!  buggywrap blew up when called with 9 !

I suspect that some creative uses of TRY would go a long way toward
addressing the issues of making more robust code (even when it uses
other, untrusted, foreign components).

-jn-
-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to