In routes.py, you can specify routes_onerror. The error route can point to 
a special error handling function in the same app or another app. The error 
handler will receive the HTTP error code, ticket number, 
request.env.request_uri, and request.url as GET variables. The error 
handler can then present a friendly message to the user, send an email to 
the administrator, etc. I added some more detail about this in the new 
version of the book (not out yet). For now, 
see http://web2py.com/book/default/chapter/04#Routes-on-Error.

Anthony

On Thursday, December 1, 2011 2:26:39 AM UTC-5, nick name wrote:
>
> Currently, there are two ways exceptions are handled in web2py:
>
> If the controller/view does *NOT* use try: except:, and an exception is 
> raised, then it is very helpfully logged in the ticket system, and a 
> somewhat-useful message (that can be customized a little, see e.g. <
> http://www.web2py.com/book/default/chapter/04#Routes-on-Error>), is given 
> as a reply. The link in this message is, in general, useful to the 
> developer, but not to the end user of the app (who will usually be unable 
> to follow the ticket link). It is very likely to break the user's flow of 
> work, as this message is not actually an app view/controller.
>
> If the controller/view *DOES* use try: except: to catch errors, then any 
> reply could be given to the user, but everything needs to be implemented in 
> the app, including db rollback, logging of problems, etc.
>
> It would be great if there was a *middle ground* in between them, where a 
> ticket could be generated for the developer, logging everything that can be 
> useful to diagnose the problem, but to let processing continue. For 
> example, I would like to be able to do something like this:
>
> try:
>   # verify that the next insert will succeed
>   table.insert(**record)
> except integrity_error, e:
>   # db.rollback() can be called here if needed.
>   ticket_id = gluon.user_ticket(e)
>   return dict(flash_message = "Unfortunately, we were unable to complete 
> the request even though we should have. Our developer has been notified. 
> You may use incident code %s to inquire about this" % 
> make_a_user_facing_code(ticket_id))
>
> return dict(flash_message="Completed successfully")
>
> That is, logically there's a bug here, and I would love to have the ticket 
> to diagnose the problem, so I'm tempted to not handle the exception at all. 
> However, I do want to detect the problem and keep the user within the 
> app-flow.
>
> This situation appears quite often If you have a database model whose 
> consistency cannot be encoded into SQL constraints that are automatically 
> enforced - and it is thus possible that a bug in one place (creating an 
> inconsistent database) manifests in another place. While developing, 
> web2py's default tickets are great. But on deployment, I'd rather have 
> friendlier logic-error handling, without giving up the snapshot/ticketing 
> system that web2py provides.
>
> Looks like it's quite easy to do already - something like:
>
> def user_ticket(e):
>   from restricted import RestrictedError
>   ticket = None
>   try: raise RestrictedError('user-ticket')
>   except RestrictedError, e: ticket = e.log(request)
>   return ticket
>
> would probably work, except that it uses web2py internals that are likely 
> to change. Is there an official way to get this kind of functionality? If 
> not, do other people think this would be a useful addition?
>

Reply via email to