Python/GAE Web请求错误处理

Kin*_*lan 4 python error-handling google-app-engine design-patterns

我正在使用Python在Google App Engine上开发应用程序.

我有一个可以返回各种输出的处理程序(目前是html和json),我正在基于发送到请求处理程序的无效参数测试系统中的明显错误.

然而,我正在做的事情感觉很脏(见下文):

class FeedHandler(webapp.RequestHandler):
def get(self):
    app = self.request.get("id")
    name = self.request.get("name") 
    output_type = self.request.get("output", default_value = "html")
    pretty = self.request.get("pretty", default_value = "")


    application = model.Application.GetByKey(app)

    if application is None:
        if output_type == "json":
            self.response.out.write(simplejson.dumps({ "errorCode" : "Application not found."}))
        self.set_status(404)
        return

    category = model.FeedCategory.GetByKey(application, name)

    if category is None:
        if output_type == "json":
            self.response.out.write(simplejson.dumps({ "errorCode" : "Category not found."}))
        self.set_status(404)
        return
Run Code Online (Sandbox Code Playgroud)

我专门处理每个输出类型的情况,并且每个"断言".

我很想知道如何清理它的建议,模式和例子(我知道尝试和维护我正在做的事情将成为一场噩梦).

我正在考虑拥有和提高自定义异常的想法,并有一个装饰器,将自动解决如何显示错误消息 - 我认为这是一个好主意,但我很乐意根据人们如何得到一些反馈和建议过去做过这个.

Nic*_*son 9

这里有几种方便的方法.首先是自我.错误(代码).默认情况下,此方法只是设置状态代码并清除输出缓冲区,但您可以覆盖它以根据错误结果输出自定义错误页面.

第二种方法是自我.handle__exception(exception,debug_mode).如果任何get/post/etc方法返回未处理的异常,则此方法由webapp基础结构调用.默认情况下,它调用self.error(500)并记录异常(如果启用了调试模式,则将其打印到输出).您可以覆盖此方法以处理您喜欢的异常.这是一个允许您为各种状态抛出异常的示例:

class StatusCodeException(Exception):
  def __init__(self, code):
    self.status_code = code

class RedirectException(StatusCodeException):
  def __init__(self, location, status=302):
    super(RedirectException, self).__init__(status)
    self.location = location

class ForbiddenException(StatusCodeException):
  def __init__(self):
    super(ForbiddenException, self).__init__(403)

class ExtendedHandler(webapp.RequestHandler):
  def handle_exception(self, exception, debug_mode):
    if isinstance(exception, RedirectException):
      self.redirect(exception.location)
    else:
      self.error(exception.status_code)
Run Code Online (Sandbox Code Playgroud)