flask abort()里面的try块行为

use*_*753 2 python flask

当我想在try块中使用烧瓶中止时,我最终会进入我的异常块

@app.route('/newsletters/<int:newsletter_id>', methods=['GET'])
def route_get_newsletter(newsletter_id):
    if request.method == 'GET':        
        try:
            newsletter = get_newsletter(newsletter_id)                
            if not newsletter:
               abort(404)
        except Exception, ex:
            logging.exception("Something awful happened!")
            abort(500)
        else:            
            return jsonify(newsletter=newsletter)
Run Code Online (Sandbox Code Playgroud)

给出输出:

ERROR:root:Something awful happened!
Traceback (most recent call last):
 File "natuurpuntapi.py", line 210, in route_get_newsletter
   abort(404)
 File "/usr/lib/python2.7/dist-packages/werkzeug/exceptions.py", line 525, in __call__
   raise self.mapping[code](*args, **kwargs)
NotFound: 404: Not Found
Run Code Online (Sandbox Code Playgroud)

和werkzeug NotFound被调用,我得到了500响应

当我把中止(404)放在try:block之外时,它可以工作,我得到了404响应

  • 编辑

我发现烧瓶abort()使用werkzeug abort(),这是一个名为Aborter()的类,当它被调用时,它会引发"raise self.mapping [code](*args,**kwargs)"

这是否意味着我不能在我自己的try块中调用abort,因为它会引发异常并最终出现在我的异常中?

小智 8

您可以检查错误是否来自 HTTPException,然后访问 .code 属性。

from werkzeug.exceptions import HTTPException

@app.route('/newsletters/<int:newsletter_id>')
def route_get_newsletter(newsletter_id):
    try:
        newsletter = get_newsletter(newsletter_id)                
        if not newsletter:
            abort(404)
    except Exception as e:
        if isinstance(e, HTTPException):
            abort(e.code)
        else:
            abort(500)
    return jsonify(newsletter=newsletter)

Run Code Online (Sandbox Code Playgroud)


Mar*_*zer 6

flask.abort(...)引发了一个异常,它是文档中描述的异常之一,是所有子类werkzeug.exceptions.HTTPException.这就是您的代码不起作用的原因.

但这里有一些其他的琐事:

鉴于这些知识,我们可以重写您的代码,如:

@app.route('/newsletters/<int:newsletter_id>', methods=['GET'])
def route_get_newsletter(newsletter_id):
    newsletter = get_newsletter(newsletter_id)
    return jsonify(newsletter=newsletter)

@app.errorhandler(500)
def catch_server_errors(e):
    logging.exception("Something awful happened!")
Run Code Online (Sandbox Code Playgroud)