如何捕获flask_restful应用程序中引发的所有异常

时间:2017-10-22 11:40:06

标签: python python-3.x flask python-decorators flask-restful

我确实使用Flask-Restful

进行简单的安静应用
from flask import Flask
from flask_restful import Api

app = Flask(__name__)
...
api = Api(app)

api.add_resource(ContactList, "/contacts")


if __name__ == '__main__':
    from object_SQLAlchemy import db
    db.init_app(app)
    app.run(port=5000)


class Contact(Resource):
    parser = reqparse.RequestParser()
    parser.add_argument(
        'contact_no',
        type=str,
        required=True,
        help="This field cannot be left blank"
    )

    @throttling.Throttle("10/m", strategy=2)
    def get(self, name):
        contact = Contacts.findbyname(name)
        if contact:
            return contact.json()
        return {"message": "Contact does not exist."}, 404

'get'方法用我的限制实现(https://github.com/scgbckbone/RESTAPI/blob/master/resources/utils/throttling.py)进行修饰。重要的是限制装饰器在某些情况下会引发异常 - 最重要的是在达到限制时。我希望能够捕获该异常并返回一些合理的json消息。

但以下都不起作用:

from ..app_alchemy import api, app


@api.errorhandler(Exception)
def handle_error(e):
    return {"error": str(e)}


@app.errorhandler(500)
def handle_error_app(e):
    return {"error": str(e.args[0])}


@app.handle_exception(Exception)
def handle_it_app(e):
    return {"error": str(e.args[0])}


@api.handle_exception(Exception)
def handle_it(e):
   return {"error": str(e.args[0])}

我仍然收到默认消息

{"message": "Internal Server Error"}

我是否正确使用错误处理程序,或者是否与使用装饰器有关?我真的不知道。

2 个答案:

答案 0 :(得分:2)

有一个Flask-Restful built-in tool用于处理异常,你可以将异常类和响应字段的字典传递给Api构造函数:

api = Api(app, errors={
    'Exception': {
        'status': 400,
        'message': 'bad_request',
        'some_description': 'Something wrong with request'
    }
})

默认情况下状态为500,所有其他字段只是转为JSON并作为响应发送。

有一个主要缺点:您不能将异常文本用作错误消息。它有一个open issue

答案 1 :(得分:1)

Sentry是一个很好的工具,可以捕获跨不同平台和框架的异常{包括Python,Django和Flask}。 This example指出你可以将它与Flask应用程序集成。

我在制作中使用它,我最喜欢的功能是它捕获错误的上下文,包括操作系统,浏览器版本等以及其他信息。