如何用CherryPy捕捉所有异常?

2024-04-25 20:50:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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())

例如

^{pr2}$

我试图捕捉到这个异常并显示一个空白页,因为客户不关心它。具体地说,结果将是一个空的主体,无论是url还是导致异常的查询字符串。在

我看过关于错误处理^{}的文档,但我没有找到实际使用它的方法。在

编辑:我放弃了使用CherryPy并使用BaseHTTPServer找到了一个简单的解决方案(见下面我的答案,因为它解决了问题,但没有回答问题……唉……)


Tags: importself目的服务器web参数getindex
3条回答

选择最适合你的:Default MethodsCustom Error Handling。在

我认为你不应该使用BaseHTTPServer。如果你的应用程序这么简单,只需获得一个轻量级的框架(例如Flask),即使它可能有点过分,或者保持低水平,但仍然在WSGI标准之内,并使用一个符合WSGI的服务器。在

医生们似乎忽略了这一部分。这是我在从源代码中查找自定义错误处理的详细说明时发现的。在

自定义错误处理

预期的HTTP响应

“error\u page”配置命名空间可用于为提供自定义HTML输出 预期响应(如404未找到)。提供一个文件名 将读取输出。内容将用值插值 %使用原始(Python)和%.s)消息(旧)回溯 string formatting。在

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

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

^{pr2}$

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

意外错误

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

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

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

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

抓捕是你的例外。这就是它如何返回一个有效的页面到浏览器,并捕获异常。在

我建议你通读所有的文件。我意识到它不是最好的文档或组织得很好,但如果你至少浏览一下它,框架会更有意义。它是一个小框架,但几乎可以从应用程序服务器执行所有您期望的事情。在

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 

请参阅this以获取上述页面文档中的示例,以获取进一步的参考。在

相关问题 更多 >