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(请参阅下面的答案,我拒绝了,因为它可以解决问题,但不能回答问题...叹气...)
不知怎的,文档似乎错过了这一部分。这是我在从源代码中寻找自定义错误处理的详细解释时发现的。
“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
,而不是简单地返回错误消息作为结果。