python-flask处理应用程序错误 [英] python-flask handling application errors
问题描述
我已经构建了一个flask应用程序,并尝试使用errorhandler装饰器从路由中捕获未处理的应用程序错误.
I've built a flask application and I try to catch unhandled application errors from my routes using the errorhandler decorator.
我有一个如下所示的main.py,
I've a main.py which looks like this,
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
Ping路由在另一个文件中,这是该文件的示例版本
The route Ping is in another file, here is a sample version of the file
class Ping(Resource):
def get(self):
raise
return {}, 200
我提出了加薪尝试并重现500内部服务器错误.这是我的应用程序引发的示例错误
I've placed a raise to try and reproduce a 500 Internal server error. 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 -
出于我无法弄清的原因,@ app.errorhandler装饰器无法捕获应用程序引发的任何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.
推荐答案
我认为您正在使用烧瓶休息式.为了捕获错误处理程序,您应该在配置文件中将配置参数 PROPAGATE_EXCEPTIONS
设置为 True
.
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.
Flask restful有其自己的错误处理程序,与Flask的错误处理程序不同.这是摘录:
Flask restful has its own error handler which differs from that of 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),
}
[...]
在将 PROPAGATE_EXCEPTIONS
设置为 True
后,您应该至少添加以下两个错误处理程序:
After setting PROPAGATE_EXCEPTIONS
to True
you should add at least these two error handlers:
@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
因此,第一个将捕获在应用程序级别引发的任何异常,甚至是您自己的自定义异常,第二个将捕获任何500错误,例如在 abort(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)
.
这篇关于python-flask处理应用程序错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!