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