Bill Allombert on Wed, 06 Apr 2011 23:56:17 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Trapping errors in library mode |
On Wed, Apr 06, 2011 at 10:52:56PM +0200, Dirk Laurie wrote: > On Wed, Apr 06, 2011 at 12:07:40PM +0200, Dirk Laurie wrote: > > When calling the Pari library from C, I don't want my program > > to exit when I do something silly like dividing by zero. > and on Wed, 6 Apr 2011 13:36:04 +0200, Bill Allombert replied: > > I suppose you are using PARI 2.3. In that case, the proper way is to set > > INIT_JMPm and to call setjmp(GP_DATA->env) somewhere in your code to > > initialize GP_DATA->env. In case of an error, PARI will do > > longjmp(GP_DATA->env). > > I'm calling Pari via C from Lua, and did it this way: > > if (1 && setjmp(GP_DATA->env)) luaL_argerror(L,k,"Pari error"); > > This works, of course after putting into my program this line: > #include <pari/paripriv.h> > > The error message is now very satisfactory: > > > pari("1/0") > *** division by zero > stdin:1: bad argument #2 to 'pari' (Pari error) > > Question though: will this still work in PARI 2.4, or must I then > use the new method? No, it will not work because GP_DATA->env does not even exist anymore. But you can do instead: jmp_buf env; void gp_err_recover(long numerr) { longjmp(env, numerr); } ... if (setjmp(env)) luaL_argerror(L,k,"Pari error"); ... cb_pari_err_recover = gp_err_recover; Cheers, Bill.