为什么Flask teardown_request在调试模式下无法获取异常对象?

我想db在发生异常时回滚我的会话,所以我尝试了:


@app.teardown_request

def teardown_request(exception):

    print "Teardown 1 {0!r}".format(exception)

    if exception:

        print ">>>> Exception Happaned <<<<"

        db.session.rollback()

        db.session.remove()

    print "good"

    db.session.remove()

我通过强制代码出错来进行测试以引发异常,即使使用此代码也是如此:


raise Exception("bacoff")

但是它总是打印"Teardown 1 None"和"good"。


让我感到困惑的是,一旦我通过关闭了DEBUG模式app.run(debug=False),该异常就显示正确了:


Teardown 1 Exception('bacoff',)

>>>> Exception Happaned <<<<

good

所以,我不知道这是Flask框架的错误,还是我的配置错误...


鸿蒙传说
浏览 466回答 2
2回答

拉风的咖菲猫

查看dispatch_request和full_dispatch_request:首先调用您的视图,其次捕获您的视图异常。只需dispatch_request使用您的错误处理程序即可覆盖,但是Flask为此提供了特殊的机制:error_handler_spec。因此,您可以使用errorhandler或register_error_handler注册处理程序以捕获异常。@app.errorhandler(YourException)def your_exception_handler(exception):&nbsp; &nbsp; print ">>>> Exception Happaned <<<<"&nbsp; &nbsp; db.session.rollback()&nbsp; &nbsp; return 'something wrong', 400@app.teardown_requestdef teardown_request(*args, **kwargs):&nbsp; &nbsp; print "good"&nbsp; &nbsp; db.session.remove()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python