当我想在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)
给出输出:
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
和werkzeug NotFound被调用,我得到500响应
当我把中止(404)放在try:block之外时,它可以工作,我得到了404响应
我发现flask abort()使用werkzeug abort()这是一个叫做Aborter()的类 当这个被调用时,它会引发“提升self.mapping [代码](* args,** kwargs)”
这是否意味着我无法在我自己的try块中调用abort,因为它会引发异常并最终出现在我的异常中?
答案 0 :(得分:6)
flask.abort(...)
引发了一个异常,这是docs中描述的所有异常之一,werkzeug.exceptions.HTTPException
的所有子类。这就是您的代码无法正常工作的原因。
但这是其他一些琐事:
methods=['GET']
,则无需在视图中检查方法。鉴于这些知识,我们可以重写您的代码,如:
@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!")
答案 1 :(得分:0)
您可以检查错误是否来自 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)