【问题标题】:Python GAE: How to return JSON-formated response even when an error occurs?Python GAME:即使发生错误,如何返回 JSON 格式的响应?
【发布时间】:2012-08-28 08:57:13
【问题描述】:

在我的 GAE 应用程序中,我有几个返回 JSON 格式响应的请求处理程序。当调用其中之一时,如果发生错误(异常或编程错误),则输出不是 JSON:它是堆栈跟踪。

我需要的是:

Output without error:
{
    "foo" : 1
    "bar" : 2
    "status" : "OK"
}

Output when an error occurs:
{
    "status" : "ERR"
    "errorMessage" : "An error occurred!"
}

我的问题是:确保在任何情况下输出都是 JSON 格式的响应的最佳做法是什么?当然,每个请求处理程序的通用解决方案会很棒。

任何帮助将不胜感激。

【问题讨论】:

    标签: python json google-app-engine error-handling


    【解决方案1】:

    当然 - 使用 ereporter 类(此处描述:https://stackoverflow.com/a/4296664/336505),但创建一个自定义 BaseHandler,将您的未捕获异常格式化为 JSON 输出:

    class BaseHandler(webapp.RequestHandler):
        def handle_exception(self, exception, debug_mode):
          self.response.headers['Content-Type'] = 'application/json'
          self.response.out.write(etc, etc) # format the exception
    

    【讨论】:

    • 这个解决方案似乎符合我的需求!我是 Python 的新手,我读到多重继承是可能的。那么您是否建议将我现有的 A 类从 BaseHandlerRequestHandler 派生?或者让BaseHandler派生自RequestHandler,然后让我现有的A类派生自BaseHandler
    • 嗨摩根 - 我建议尝试做后者:“让 BaseHandler 派生自 RequestHandler,然后让我现有的 A 类派生自 BaseHandler”
    【解决方案2】:

    如果发生错误,为避免获得堆栈跟踪或其他丑陋的输出,您将需要使用 try ... 除外:http://docs.python.org/tutorial/errors.html

    例如

    try:
        # ... your code ...
    except TypeError as e:
        # ... do something with this error type
    except:
        # ... generic exception catchall
        # output that JSON response
    

    【讨论】:

    • 感谢您的回复。事实上,我已经尝试过 try/except 语句。但我需要一个更通用的解决方案来应用于每个请求处理程序。
    • 你到底是什么意思? try... except... 是在 Python 中捕获错误的唯一方法。你必须把它放在里面。要将其应用于所有内容,您只需将其放在代码中的更高级别,然后在 except 语句中确定您正在使用的请求处理程序并相应地调整输出。
    • @GTF 这不是唯一的方法...检查其他答案.. 问题是针对 Google App Engine :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2012-12-08
    • 2015-04-11
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2016-05-20
    相关资源
    最近更新 更多