2013-05-11 39 views
2

我想在发生异常时回滚我db会议,所以我尝试:为什么Flask teardown_request在调试模式下无法获取异常对象(始终为无,但debug = True时正常)?

@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"

什么困惑我的是,一旦我通过app.run(debug=False)关闭调试模式, 异常显示右:

Teardown 1 Exception('bacoff',) 
>>>> Exception Happaned <<<< 
good 

所以,我不知道这是瓶框架的一个bug,或我的配置故障...

我ENV是:

  • BeautifulSoup 3.2.1
  • 瓶0.9
  • 烧瓶登录0.1.3
  • 瓶邮件0.8.2
  • 烧瓶的OpenID 1.1.1
  • 烧瓶SQLAlchemy的0.16
  • 烧瓶WTF 0.8.3
  • 烧瓶WhooshAlchemy 0.55A
  • 的Jinja2 2.6
  • SQLAlchemy的0.8.1
  • Tempita 0.5.1
  • WTForms 1.0.3
  • WERKZEUG 0.8.3
  • 嗖2.4.1
  • 信号灯1.2
  • 装饰3.4.0
  • LXML 3.2.0
  • pycurl 7.19.0
  • 蟒-openid 2.2.5
  • 请求1.2.0
  • sqlalchemy-migrate 0.7.2
  • 0.1.2的wsgiref
+1

teardown_request与异常无关:http://flask.pocoo.org/docs/api/#flask.Flask.teardown_request – thkang 2013-05-11 19:38:01

+1

该文件显示“当一个拆卸函数因异常而被调用时,它将被传递一个错误对象“,所以我认为一旦引发异常就会传递给teardown_request函数,对吗?除此之外,当DEBUG = True模式时,我可以得到异常。这些让我感到困惑。 – 2013-05-12 00:30:26

回答

0

dispatch_requestfull_dispatch_request:先打电话给你的观点,第二赶上你的看法例外。你可以用你的错误处理程序覆盖dispatch_request,但Flask为此提供了特殊的机制:error_handler_spec。 因此,您可以使用errorhandlerregister_error_handler注册处理程序来捕捉您的异常。

@app.errorhandler(YourException) 
def your_exception_handler(exception): 
    print ">>>> Exception Happaned <<<<" 
    db.session.rollback() 
    return 'something wrong', 400 

@app.teardown_request 
def teardown_request(*args, **kwargs): 
    print "good" 
    db.session.remove() 
+0

似乎需要特定的异常类在你的解决方案,我想回滚db会话在任何异常....感谢tbicr。 – 2013-05-13 15:29:10

+0

您可以使用'Exception'类,但在这种情况下,任何HTTPException(http://werkzeug.pocoo.org/docs/exceptions/#werkzeug.exceptions.HTTPException)都会默认处理。我不认为使用'Exception'处理程序最好的解决方案(你总是可以处理特定的异常),但它可能需要你的情况。最好看一下代码:https://github.com/mitsuhiko/flask/blob/master/flask/app.py#L1468,你总是可以为你的情况重写'dispatch_request'或'handle_user_exception'。 – tbicr 2013-05-15 05:08:11

+0

感谢您的帮助,tbicr.I终于通过添加“app.config ['PRESERVE_CONTEXT_ON_EXCEPTION'] = False来解决它,解决方案来自https://github.com/mitsuhiko/flask/issues/661#issuecomment-11975645 。谢谢。 – 2013-05-16 12:49:34

相关问题