【问题标题】:Flask default error handler not being called未调用 Flask 默认错误处理程序
【发布时间】:2013-12-16 05:53:25
【问题描述】:

我有一个errors.py 模块将错误映射到模板。我想添加一个默认错误处理程序并遇到:http://flask.pocoo.org/mailinglist/archive/2012/7/12/default-error-handler/#cbeb8809dc0da7133f14b99e16f31d6b

我正在使用Blueprint 对事物进行模块化,错误模块具有以下映射:

@err.app_errorhandler(403)
def forbidden(e):
   return render_template('403.html'), 403

@err.app_errorhandler(500)
def serverError(e):
   return render_template('500.html'), 500

@err.app_errorhandler(Exception)
def defaultHandler(e):
   return render_template('defaultError.html'), e.code

如果我中止它们(或自然诱导它们),特定映射(403、500)可以正常工作,但如果我中止其他任何东西(404 等),则不会调用 defaulHandler()

【问题讨论】:

    标签: python error-handling flask


    【解决方案1】:

    你可以这样做:

    app.config['TRAP_HTTP_EXCEPTIONS']=True
    app.register_error_handler(Exception, defaultHandler)
    

    【讨论】:

      【解决方案2】:

      看起来 404 实际上并没有在烧瓶代码中引发异常,因此默认处理程序没有任何理由被击中。如果我将 raise Exception 添加到我的一个 url 映射并导航到它,我就可以成功。

      当然,如果你有一个 500 错误映射,异常会变成服务器端错误,因此它会落入那个捕获范围,所以我现在看不到异常捕获的使用(我可以'没有想到任何情况下它会捕获 500 errorhandler 不会捕获的东西)。

      【讨论】:

        【解决方案3】:

        检查render_template('defaultError.html')e.code 不会引发任何异常。例如,我不确定您的任何异常是否可以具有code 属性,请尝试非常简单的示例:

        @err.app_errorhandler(Exception)
        def defaultHandler(e):
           return 'error handler there', 500
        

        【讨论】:

        • 没有引发我可以识别的异常(使用烧瓶内置服务器运行)。无论如何,我会认为我的 500 映射会被击中。
        • 对我来说效果很好,flask==0.10.1wergzeug=0.9.4。关于用户异常看看为什么你的代码没有在那里处理github.com/mitsuhiko/flask/blob/master/flask/app.py#L1475
        猜你喜欢
        • 2013-06-19
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        • 2015-07-13
        • 1970-01-01
        • 1970-01-01
        • 2019-06-20
        • 1970-01-01
        相关资源
        最近更新 更多