【问题标题】:flask errorhandler wont catch errors if view function returns an invalid response如果视图函数返回无效响应,烧瓶错误处理程序将不会捕获错误
【发布时间】:2022-09-24 10:14:47
【问题描述】:

我想为我的 api 项目捕获所有错误并以 json 格式返回错误。

这是我的错误处理程序:

@app.errorhandler(Exception)
def handle_exception(e):
    if not isinstance(e, HTTPException):
        print(e)
        return {
            \"code\": 500,
            \"name\": \"Internal Server Error\",
            \"description\": repr(e),
        }, 500
    else:
        response = e.get_response()
        response.data = json.dumps({
            \"code\": e.code,
            \"name\": e.name,
            \"description\": e.description,
        })
        response.content_type = \"application/json\"
        return response

如果它发生在视图函数内部,我的错误处理程序会捕获异常:

@api.get(\"/\")
def all(user):
    a.b
    return []

这成功捕获了以下异常并返回 json 响应:

名称 \'a\' 未定义

但是如果视图函数很好但返回值不是 json 友好的,它就不会被捕获:

@api.get(\"/\")
def all(user):
    return 1

它引发以下错误并以 html 格式返回错误。

TypeError:视图函数没有返回有效响应。返回类型必须是字符串、字典、列表、带有标头或状态的元组、响应实例或可调用的 WSGI,但它是一个 int。

    标签: python flask


    【解决方案1】:

    这是因为return a.b 返回一个NameError,而return 1 返回一个TypeError

    来自docs

    在调试模式下,将不使用“500 Internal Server Error”的处理程序。反而, 将显示交互式调试器。

    NameError 不是HTTPException 的实例,因此您的处理程序不会从端点捕获HTTPException,它返回500

    相反,TypeErrorHTTPException 的一个实例,这意味着InternalServerError 将被捕获,因为你在调试模式下,首先是 Werkzeug 捕获错误,并将其显示在调试控制台中。

    如果你转离开在调试模式下,您将看到仅由您的处理程序处理的500s。

    【讨论】:

      猜你喜欢
      • 2014-09-21
      • 2018-07-26
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      相关资源
      最近更新 更多