Ilya Zakharevich on Wed, 11 Sep 2002 12:57:39 -0700


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: error recovery (was Re: gp: series bug)


On Wed, Sep 11, 2002 at 04:56:14AM +0200, Karim BELABAS wrote:
> The error recovery code in libpari is experimental (hence not documented),
> and I've just modified it in CVS a few hours ago, while investigating some of
> Igor's bug reports [ funny you'd ask just now! ].
> 
> I wanted to encapsulate all the code in the library using (something looking
> like) the trap() mechanism. So I defined a set of 3 macros CATCH / TRY /
> ENDCATCH to hide more complicated routines.

Please do not.  trap() is not a mechanism good enough to have it in
two places.  E.g.:

>   CATCH(numerr) {

I do not think the situation with one trap to catch is frequent enough
to make this interface useful.

>     /* recovery */
>   } TRY {
>     /* code */
>   } ENDCATCH;

> IMPORTANT: the code between CATCH / ENDCATCH is _not_ allowed to use any
> direct flow control instruction to jump out of the protected code [ longjmp,
> break, return, goto, etc. ]. It is OK to fool around within the protected
> area. Getting out using the PARI err() function is also allowed [ e.g. if an
> exception is raised from 'code', not caught by this (or a deeper) block ],
> since it also performs the required cleanup.

Typically, one will want to perform cleanups manually is needed to (to
simplify propagation of the trap to wrappers in another
exception-conscious language).

> Note: I could provide another macro, says CATCH_RELEASE(), that you could
> invoke if you insist on getting out [ and would execute the ENDCATCH cleanup
> code ]. It is not needed in pari and I don't think I want it.

So please do.

>   CATCH(-1)

    CATCH(CATCH_ALL)

>   {
>     switch (pari_errno)
>     {
>       case primer1: ...

I think this is more useful than the specialized interface above...

Ilya