我有一个问题,与装饰器有关。例如,我编写了下一个装饰器,它处理错误,然后输出错误。
def handle_error(func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as err:
print(err)
return wrapper
@handle_error
def raise_error():
return 1 / 0
raise_error()
但是,如果我想对 Flask 做同样的事情,这是行不通的。
@app.route('/')
@handle_error
def index():
return {'hello'}
if __name__ == '__main__':
app.run()
所以我猜测,是在 route 装饰器中引发的错误,对吗?如果是,我有问题:从技术上讲,我可以编写一个装饰器来处理 route 装饰器的所有异常?
你可以创建一个类似这样的错误处理程序,就像我在我的装饰器中所做的那样
def error_handler() -> object:
def wrapper(f):
@wraps(f)
def wrapped(*args, **kwargs):
try:
return f(*args, **kwargs)
# handle different types of errors and return messages accordingly with status code
except Exception as e:
if isinstance(e, ValueError):
return jsonify({'message': e.args[0], 'type': 'ValueError'}), 400
elif isinstance(e, AttributeError):
return jsonify({'message': e.args[0], 'type': 'AttributeError'}), 400
elif isinstance(e, KeyError):
return jsonify({'message': e.args[0], 'type': 'KeyError'}), 400
elif isinstance(e, TypeError):
return jsonify({'message': e.args[0], 'type': 'TypeError'}), 400
else:
return jsonify({'message': str(e), 'type': 'InternalServerError'}), 500
return wrapped
return wrapper
如果您希望将这些错误记录在文件中,您可以在我们初始化 Flask 应用程序的位置导入并设置日志记录。日志消息以及来自 except 块的错误。
您可以将错误处理程序与记录器一起使用。
logger = app.logger()
@app.errorhandler(500)
def somehandler(e):
logger.critical(e.description) # this is level of logger
所以当发生 500 错误时,记录器将工作。 你也可以犯自己的错误。
Flask 已经有了
errorhandler()
装饰器,在这里查看快速介绍。
您不会使用它来装饰您的视图函数,而是使用它来装饰您想要的错误处理函数。
以您的示例代码为例,使用此装饰器可能看起来像这样:
@app.route('/')
def index():
return {'hello'}
@app.route('/dividebyzero')
def divbyzero():
return 1 / 0
@app.errorhandler(404):
def handle_notfound(e):
return 'we could not find the page'
@app.errorhandler(500):
def handle_intsrverr(e):
return 'we stumbled upon some exception'
if __name__ == '__main__':
app.run()