From: Iwan V. <iv...@la...> - 2006-12-20 12:58:05
|
Hi there, I'm struggling to get Spyce to use my custom page-level error handler. According to the comments in the spyceconf.py, I need to set pageerror to a function: "# The pageerror option sets the default page-level error handler." The docs at http://spyce.sourceforge.net/docs/doc-mod_error.html do not dispute this, but does not give the name of the config variable to be set. However, my function seems never to get called. What am I missing? Here's my test: ---- spyceconf.py --- def my_handler(*args): raise 'handler called' pageerror = my_handler ----- somepage.spy ----- [[raise 'this is an error']] -i |
From: Iwan V. <iv...@la...> - 2006-12-21 05:57:39
|
Hi Philip, On Wed, 2006-12-20 at 10:35 -0500, Philip Semanchuk wrote: > On Dec 20, 2006, at 7:57 AM, Iwan Vosloo wrote: > Hi Ivan, > In my spyceconf.py, I have this comment -- > > # The pageerror option sets the default page-level error handler. > # "Page-level" means all runtime errors that occur during the > # processing of a Spyce script (i.e. after the compilation phase has > # completed successfully) > # > # The format of this option is one of: > # ('string', 'MODULE', 'VARIABLE') > # ('file', 'URL') > # (This format is used since the error template must be transformed into > # compiled spyce code, which can't be done before the configuration file > # is completely loaded.) > # > # Please refer to the default template to see how to define your own > # page-level error handlers. > > > And this bit of code works for me: > pageerrortemplate = ('string', 'TheModuleName', 'TheFunctionName') > Yes, that comment (except for the very first line, which refers to "pageerror") applies to "pageerrortemplate" - as you use it. My (probably erroneous) understanding from what I've read is that there is an error handling _function_ also, and that the default one renders "pageerrortemplate". But I don't want it to render any templates at all, I want it just to call my own function... I call spyce programmatically from another program, and would rather catch an exception myself, rather than have spyce render an error page. This is the behaviour I'm trying to change... Do I have it wrong? -i |
From: Philip S. <ph...@se...> - 2006-12-21 19:34:39
|
On Dec 21, 2006, at 12:54 AM, Iwan Vosloo wrote: > Hi Philip, > > On Wed, 2006-12-20 at 10:35 -0500, Philip Semanchuk wrote: >> On Dec 20, 2006, at 7:57 AM, Iwan Vosloo wrote: >> Hi Ivan, >> In my spyceconf.py, I have this comment -- >> >> # The pageerror option sets the default page-level error handler. >> # "Page-level" means all runtime errors that occur during the >> # processing of a Spyce script (i.e. after the compilation phase has >> # completed successfully) >> # >> # The format of this option is one of: >> # ('string', 'MODULE', 'VARIABLE') >> # ('file', 'URL') >> # (This format is used since the error template must be transformed >> into >> # compiled spyce code, which can't be done before the configuration >> file >> # is completely loaded.) >> # >> # Please refer to the default template to see how to define your own >> # page-level error handlers. >> >> >> And this bit of code works for me: >> pageerrortemplate = ('string', 'TheModuleName', 'TheFunctionName') >> > > Yes, that comment (except for the very first line, which refers to > "pageerror") applies to "pageerrortemplate" - as you use it. > > My (probably erroneous) understanding from what I've read is that there > is an error handling _function_ also, and that the default one renders > "pageerrortemplate". > > But I don't want it to render any templates at all, I want it just to > call my own function... I call spyce programmatically from another > program, and would rather catch an exception myself, rather than have > spyce render an error page. This is the behaviour I'm trying to > change... Iwan, I also call Spyce programmatically in addition to using it to serve up dynamic Web pages, so I appreciate where you're coming from. However, I don't actually get what you're trying to do. Are you saying that some of your errors are recoverable and that you'd like to ignore them and have Spyce continue processing? My code for handling errors generated programmatically gets some detail about the error, records that data and then dumps processing to an "oops.html" file which basically says "Sorry, something went wrong". I understand that you don't want the output page, so couldn't you just use the same technique to execute whatever code you want and make oops.html a zero-byte file? Sorry that I'm not getting it! =) Maybe a high level example of what you'd like to be able to do would help. bye Philip |
From: Jonathan E. <jon...@ca...> - 2006-12-21 20:06:04
|
On Thu, 21 Dec 2006 07:54:29 +0200, "Iwan Vosloo" <iv...@la...> said: > Hi Philip, > > On Wed, 2006-12-20 at 10:35 -0500, Philip Semanchuk wrote: > > And this bit of code works for me: > > pageerrortemplate = ('string', 'TheModuleName', 'TheFunctionName') > > > > Yes, that comment (except for the very first line, which refers to > "pageerror") applies to "pageerrortemplate" - as you use it. That's just a mistake, all references should be to pageerrortemplate. > My (probably erroneous) understanding from what I've read is that there > is an error handling _function_ also, and that the default one renders > "pageerrortemplate". Well, that's kind of what the server-level errorhandler function does, by default. So it sounds like overriding that is what you want to do. -Jonathan |
From: Iwan V. <iv...@la...> - 2006-12-22 09:53:34
|
Hi Philip, On Thu, 2006-12-21 at 14:34 -0500, Philip Semanchuk wrote: > I also call Spyce programmatically in addition to using it to serve up > dynamic Web pages, so I appreciate where you're coming from. However, I > don't actually get what you're trying to do. Are you saying that some > of your errors are recoverable and that you'd like to ignore them and > have Spyce continue processing? No, I just want spyce NOT to handle the exception at all so that it gets propagated to the program calling spyce - which will then handle the exception. If spyce catches the exception and renders a page all seems OK to a calling program. Does that explain it? > My code for handling errors generated programmatically gets some detail > about the error, records that data and then dumps processing to an > "oops.html" file which basically says "Sorry, something went wrong". I > understand that you don't want the output page, so couldn't you just > use the same technique to execute whatever code you want and make > oops.html a zero-byte file? I could try something like this, but I thought I can do it more elegantly... Thanks -i |
From: Philip S. <ph...@se...> - 2006-12-22 15:50:07
|
On Dec 22, 2006, at 4:53 AM, Iwan Vosloo wrote: > Hi Philip, > > On Thu, 2006-12-21 at 14:34 -0500, Philip Semanchuk wrote: >> I also call Spyce programmatically in addition to using it to serve up >> dynamic Web pages, so I appreciate where you're coming from. However, >> I >> don't actually get what you're trying to do. Are you saying that some >> of your errors are recoverable and that you'd like to ignore them and >> have Spyce continue processing? > > No, I just want spyce NOT to handle the exception at all so that it > gets > propagated to the program calling spyce - which will then handle the > exception. If spyce catches the exception and renders a page all seems > OK to a calling program. > > Does that explain it? > >> My code for handling errors generated programmatically gets some >> detail >> about the error, records that data and then dumps processing to an >> "oops.html" file which basically says "Sorry, something went wrong". I >> understand that you don't want the output page, so couldn't you just >> use the same technique to execute whatever code you want and make >> oops.html a zero-byte file? > > I could try something like this, but I thought I can do it more > elegantly... Yes, now I understand, thanks for being patient. I agree that the available ways of communicating error status to the calling program are un-Pythonic. I have also considered this problem and I might try what Jonathan suggested about over-riding the server-level error handler. Up until now I have been solving this problem on a case-by-case basis. Sorry I wasn't more help. Philip |
From: Iwan V. <iv...@la...> - 2006-12-22 09:57:21
|
Hi Jonathan, On Thu, 2006-12-21 at 12:05 -0800, Jonathan Ellis wrote: > On Thu, 21 Dec 2006 07:54:29 +0200, "Iwan Vosloo" <iv...@la...> said: > > Hi Philip, > > > > On Wed, 2006-12-20 at 10:35 -0500, Philip Semanchuk wrote: > > > And this bit of code works for me: > > > pageerrortemplate = ('string', 'TheModuleName', 'TheFunctionName') > > > > > > > Yes, that comment (except for the very first line, which refers to > > "pageerror") applies to "pageerrortemplate" - as you use it. > > That's just a mistake, all references should be to pageerrortemplate. Ok, thanks, that makes sense. So there's only the server error handler function, and the page error template. > > My (probably erroneous) understanding from what I've read is that there > > is an error handling _function_ also, and that the default one renders > > "pageerrortemplate". > > Well, that's kind of what the server-level errorhandler function does, > by default. So it sounds like overriding that is what you want to do. But my understanding is that the server-level error handler will not be called for, say spyce compilation errors or exceptions in python code called from a spyce template. Am I understanding correctly? Thanks -i |
From: Jonathan E. <jon...@ca...> - 2006-12-22 15:02:02
|
On Fri, 22 Dec 2006 11:57:10 +0200, "Iwan Vosloo" <iv...@la...> said: > On Thu, 2006-12-21 at 12:05 -0800, Jonathan Ellis wrote: > > On Thu, 21 Dec 2006 07:54:29 +0200, "Iwan Vosloo" <iv...@la...> said: > > > My (probably erroneous) understanding from what I've read is that there > > > is an error handling _function_ also, and that the default one renders > > > "pageerrortemplate". > > > > Well, that's kind of what the server-level errorhandler function does, > > by default. So it sounds like overriding that is what you want to do. > > But my understanding is that the server-level error handler will not be > called for, say spyce compilation errors or exceptions in python code > called from a spyce template. Am I understanding correctly? I don't think so... There may be some compile errors that don't, but the majority do... Python errors will be re-raised as spyceRuntimeException. -Jonathan |
From: Iwan V. <iv...@la...> - 2006-12-25 08:16:45
|
Hi Jonathan, Philip, On Fri, 2006-12-22 at 07:01 -0800, Jonathan Ellis wrote: > On Fri, 22 Dec 2006 11:57:10 +0200, "Iwan Vosloo" <iv...@la...> said: > > But my understanding is that the server-level error handler will not be > > called for, say spyce compilation errors or exceptions in python code > > called from a spyce template. Am I understanding correctly? > > I don't think so... There may be some compile errors that don't, but > the majority do... Python errors will be re-raised as > spyceRuntimeException. Sorry, but I still don't get it - it does not seem that the server-level error handler is called for Python exceptions. Here's my test... I have copied the spyceconf.py as shipped and just changed the following: #import error #errorhandler = error.serverHandler def reraisingHandler(theServer, theRequest, theResponse, theError): raise theError errorhandler = reraisingHandler I then run spyceCmd.py --conf that_changed_spyceconf.py afile.spy afile.spy just has a line: [[ raise 'some error' ]] But it still returns an html page, instead of just raising the exception: <html> <title>Spyce exception: some error </title> <body> <table cellspacing=10 border=0> <tr><td colspan=2><h1>Spyce exception</h1></td></tr> <tr><td valign=top align=right><b>File:</b></td><td>/home/iwan/work/play.d/spyce/exc/afile.spy</tr> <tr><td valign=top align=right><b>Message:</b></td> <td><pre>some error </pre></tr> <tr><td valign=top align=right><b>Stack:</b></td><td> afile.spy:2, in (main):<br> <table border=0><tr><td width=10></td><td> <pre>raise 'some error'</pre> </td></tr></table> </td></tr> </table> </body></html> |
From: Jonathan E. <jon...@ca...> - 2007-01-30 21:45:16
|
Hi Iwan, I'm digging into the error stuff again since it seems to confuse a lot of people and will probably get some kind of rewrite for 2.2. The short version is, * error.serverHandler [or errorhandler in your config] gets called ONLY for compile-time errors * error.spyceHandler gets called ONLY for run-time errors Currently you can only override error.spyceHandler by calling "error.setHandler" on a per-page basis in your .spy files. (Or by editing modules/error.py.) Manually raising an exception is a run-time error so setting errorhandler has no effect. On Mon, 25 Dec 2006 10:16:29 +0200, "Iwan Vosloo" <iv...@la...> said: > Sorry, but I still don't get it - it does not seem that the server-level > error handler is called for Python exceptions. Here's my test... I > have copied the spyceconf.py as shipped and just changed the following: > > #import error > #errorhandler = error.serverHandler > def reraisingHandler(theServer, theRequest, theResponse, theError): > raise theError > errorhandler = reraisingHandler > > I then run spyceCmd.py --conf that_changed_spyceconf.py afile.spy > > afile.spy just has a line: > > [[ raise 'some error' ]] > > > But it still returns an html page, instead of just raising the > exception: > <html> > <title>Spyce exception: some error > </title> > <body> > <table cellspacing=10 border=0> > <tr><td colspan=2><h1>Spyce exception</h1></td></tr> > <tr><td valign=top > align=right><b>File:</b></td><td>/home/iwan/work/play.d/spyce/exc/afile.spy</tr> > <tr><td valign=top align=right><b>Message:</b></td> > <td><pre>some error > </pre></tr> > <tr><td valign=top align=right><b>Stack:</b></td><td> > afile.spy:2, in (main):<br> > <table border=0><tr><td width=10></td><td> > <pre>raise 'some error'</pre> > </td></tr></table> > </td></tr> > </table> > </body></html> > > > |