如何使用CherryPy捕获所有异常?

WoJ*_*WoJ 5 python exception-handling cherrypy

我使用CherryPy运行非常简单的Web服务器。它旨在处理GET参数,如果参数正确,请对其进行处理。

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())
Run Code Online (Sandbox Code Playgroud)

例如,

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
Run Code Online (Sandbox Code Playgroud)

我试图捕获此异常并显示空白页,因为客户端不在乎它。具体来说,无论是导致异常的url还是查询字符串,结果都是空的主体。

我看了有关错误处理的文档cherrypy._cperror,但没有找到实际使用它的方法。

编辑:我放弃了使用,CherryPy并找到了一个简单的使用解决方案BaseHTTPServer(请参阅下面的答案,我拒绝了,因为它可以解决问题,但不能回答问题...叹气...)

Rag*_*nya 5

不知怎的,文档似乎错过了这一部分。这是我在从源代码中寻找自定义错误处理的详细解释时发现的。

自定义错误处理

预期的 HTTP 响应

“error_page”配置命名空间可用于为预期响应(如 404 Not Found)提供自定义 HTML 输出。提供将从中读取输出的文件名。内容将使用普通旧 Python字符串格式插入值 %(status)s、%(message)s、%(traceback)s 和 %(version)s 。

_cp_config = {
    'error_page.404': os.path.join(localDir, "static/index.html")
}
Run Code Online (Sandbox Code Playgroud)

从版本 3.1 开始,您还可以提供函数或其他可调用函数作为 error_page 条目。它将传递插入到模板中的相同状态、消息、回溯和版本参数

def error_page_402(status, message, traceback, version):
    return "Error %s - Well, I'm very sorry but you haven't paid!" % status
cherrypy.config.update({'error_page.402': error_page_402})
Run Code Online (Sandbox Code Playgroud)

同样在 3.1 中,除了编号的错误代码之外,您还可以提供 error_page.default处理没有自己的 error_page 条目的所有代码。

意外错误

CherryPy 还有一个通用的错误处理机制:每当代码中发生意外错误时,它都会调用 Request.error_response来设置响应状态、标头和正文。默认情况下,这与 的输出相同 HTTPError(500)。如果你想提供一些其他行为,通常替换“request.error_response”。

以下是一些示例代码,展示了如何显示自定义错误消息并发送包含错误的电子邮件

from cherrypy import _cperror

def handle_error():
    cherrypy.response.status = 500
    cherrypy.response.body = [
        "<html><body>Sorry, an error occurred</body></html>"
    ]
    sendMail('error@domain.com',
             'Error in your web app',
             _cperror.format_exc())

@cherrypy.config(**{'request.error_response': handle_error})
class Root:
    pass
Run Code Online (Sandbox Code Playgroud)

请注意,您必须显式设置 response.body ,而不是简单地返回错误消息作为结果。