简体   繁体   English

python-flask处理应用程序错误

[英]python-flask handling application errors

I've built a flask application and I try to catch unhandled application errors from my routes using the errorhandler decorator. 我建立了一个flask应用程序,然后尝试使用errorhandler装饰器从路由中捕获未处理的应用程序错误。

I've a main.py which looks like this, 我有一个看起来像这样的main.py,

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

api.add_resource(Ping, '/ping')

@app.errorhandler(500)
def internal_server_error(error):
    print "caught internal server error"
    return "This page does not exist", 500

The route Ping is in another file, here is a sample version of the file 路由Ping在另一个文件中,这是该文件的示例版本

class Ping(Resource):
    def get(self):

        raise
        return {}, 200

I've placed a raise to try and reproduce a 500 Internal server error. 我提出了加薪尝试并重现500内部服务器错误。 Here is a sample error raised by my application 这是我的应用程序引发的示例错误

[2019-01-26 10:37:36,449] ERROR in app: Exception on /events/v1/monitoring/ping [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/usr/local/lib64/python2.7/site-packages/flask_restful/__init__.py", line 480, in wrapper
    resp = resource(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/flask/views.py", line 88, in view
    return self.dispatch_request(*args, **kwargs)
  File "/usr/local/lib64/python2.7/site-packages/flask_restful/__init__.py", line 595, in dispatch_request
    resp = meth(*args, **kwargs)
  File "/usr/lib/python2.7/site-packages/myapi/ping.py", line 17, in get
    raise
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType
127.0.0.1 - - [26/Jan/2019 10:37:36] "GET /ping HTTP/1.0" 500 -

For reasons I haven't been able to figure, the @app.errorhandler decorator doesn't catch any 500 error that come are raised by the application. 由于我无法弄清的原因,@ app.errorhandler装饰器无法捕获应用程序引发的任何500个错误。

I think you are using flask-restful . 我认为您使用的是烧瓶式的 In order to your error handler be catched you should set the config param PROPAGATE_EXCEPTIONS to True in your config file. 为了捕获错误处理程序,应在配置文件中将配置参数PROPAGATE_EXCEPTIONS设置为True

Flask restful has its own error handler which differs from that of Flask. Flask restful有自己的错误处理程序,与Flask不同。 This is an extract: 这是摘录:

[...]

if not isinstance(e, HTTPException) and current_app.propagate_exceptions:
    exc_type, exc_value, tb = sys.exc_info()
    if exc_value is e:
        raise
    else:
        raise e

headers = Headers()
if isinstance(e, HTTPException):
    code = e.code
    default_data = {
        'message': getattr(e, 'description', http_status_message(code))
    }
    headers = e.get_response().headers
else:
    code = 500
    default_data = {
        'message': http_status_message(code),
    }
[...]

After setting PROPAGATE_EXCEPTIONS to True you should add at least these two error handlers: PROPAGATE_EXCEPTIONS设置为True您至少应添加以下两个错误处理程序:

@app.errorhandler(Exception)
def internal_server_error(e):
    return jsonify({'msg': 'Internal server error'}), 500

@app.errorhandler(500)
def internal_server_error_500(e):
    return jsonify({'msg': 'Internal server error'}), 500

So, the first one will catch any exception raised at application level, even your own custom exceptions and the second one will catch any 500 error, for example raised on abort(500) . 因此,第一个将捕获在应用程序级别引发的任何异常,甚至是您自己的自定义异常,第二个将捕获任何500错误,例如在abort(500)上引发。

尝试以下一项:

@app.errorhandler(Exception)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM