gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:50:34 25 4
gpt4 key购买 nike

我使用 CherryPy运行一个非常简单的网络服务器。它旨在处理 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())

例如,

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

我正在 try catch 此异常并显示一个空白页面,因为客户不关心它。具体来说,无论导致异常的 url 或查询字符串如何,结果都将是一个空主体。

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

注意:我放弃了使用 CherryPy 并使用 BaseHTTPServer ( see my answer below ) 找到了一个简单的解决方案

最佳答案

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

自定义错误处理

预期的 HTTP 响应

“error_page”配置命名空间可用于为以下内容提供自定义 HTML 输出预期的响应(如 404 Not Found)。提供一个文件名,从中将读取输出。内容将用值进行插值%(status)s, %(message)s, %(traceback)s, and %(version)s using plain old Python string formatting .

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

从 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})

同样在 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

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

关于python - 如何使用 CherryPy 捕获所有异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20395565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com