WoJ WoJ - 2 months ago 27
Python Question

How to catch all exceptions with CherryPy?

I use CherryPy to run a very simple web server. It is intended to process the

GET
parameters and, if they are correct, do something with them.

import cherrypy

class MainServer(object):
def index(self, **params):
# do things with correct parameters
if 'a' in params:
print params['a']

index.exposed = True

cherrypy.quickstart(MainServer())


For example,

http://127.0.0.1:8080/abcde:

404 Not Found

The path '/abcde' was not found.

Traceback (most recent call last):
File "C:\Python27\lib\site-packages\cherrypy\_cprequest.py", line 656, in respond
response.body = self.handler()
File "C:\Python27\lib\site-packages\cherrypy\lib\encoding.py", line 188, in __call__
self.body = self.oldhandler(*args, **kwargs)
File "C:\Python27\lib\site-packages\cherrypy\_cperror.py", line 386, in __call__
raise self
NotFound: (404, "The path '/abcde' was not found.")
Powered by CherryPy 3.2.4


I am trying to catch this exception and show a blank page because the clients do not care about it. Specifically, the result would be an empty body, no matter the url or query string that resulted in an exception.

I had a look at documentation on error handling
cherrypy._cperror
, but I did not find a way to actually use it.

EDIT: I gave up using
CherryPy
and found a simple solution using
BaseHTTPServer
(see my answer below, downvoted because it solves the issue but does not answer the question ...sigh...)

Answer

CherryPy IS catching your exception. That's how it returns a valid page to the browser with the caught exception.

I suggest you read through all the documentation. I realize it isn't the best documentation or organized well, but if you at least skim through it the framework will make more sense. It is a small framework, but does almost everything you'd expect from a application server.

import cherrypy


def show_blank_page_on_error():
    """Instead of showing something useful to developers but
    disturbing to clients we will show a blank page.

    """
    cherrypy.response.status = 500

    cherrypy.response.body = ''


class Root():
    """Root of the application"""

    _cp_config = {'request.error_response': show_blank_page_on_error}

    @cherrypy.expose
    def index(self):
        """Root url handler"""

        raise Exception 

See this for the example in the documentation on the page mentioned above for further reference.

Comments