Karim BELABAS on Thu, 12 Sep 2002 00:36:03 +0200 (MEST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: error recovery (was Re: gp: series bug) |
On Wed, 11 Sep 2002, Ilya Zakharevich wrote: > 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. Please elaborate. I'm note sure I understand your point. You'd rather have a general CATCH(CATCH_ALL), and no specific error number ? Well, if I only want to catch "precision error in truncation", I'd rather have CATCH(precer) { ...; } than CATCH(CATCH_ALL) { CATCH_RELEASE(); switch (pari_errno) { case precer: ...; break; default: THROW(pari_errno); } } and have to propagate everything I get and don't like. I don't see any point in complicating the interface, granted that both forms are available at essentially no extra cost. It already occurs naturally 6 times in the library (+ 1 to define trap()). In most cases we want to catch a specific error ( Exception: gegal and the pipe testing code ). What _is_ true is that most error numbers are useless. [...] > 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) OK, I've added CATCH_RELEASE() and used CATCH_ALL instead of hardocding negative integers. In fact CATCH_RELEASE() simplifies some code. > > { > > switch (pari_errno) > > { > > case primer1: ... > > I think this is more useful than the specialized interface above... I don't. I think both are useful (the latter is not yet useful anywhere in the library for instance). In any case, I've also included it. Karim. -- Karim Belabas Tel: (+33) (0)1 69 15 57 48 Dép. de Mathematiques, Bat. 425 Fax: (+33) (0)1 69 15 60 19 Université Paris-Sud Email: Karim.Belabas@math.u-psud.fr F-91405 Orsay (France) http://www.math.u-psud.fr/~belabas/ -- PARI/GP Home Page: http://www.parigp-home.de/