我正在努力使用 Flask-RESTful 处理 Flask API 中的传统错误..
所以基本上我的 main.py 中有一个端点:
error_handler(app)
class MyEndpoint(Resource):
def post(self):
try:
result = my_function()
return result
except Exception as e:
abort(400, message=f"{e.args[0]}")
我的 be.py 文件中还定义了一个
my_function
:
def my_function():
try:
#some logic
except Exception as e:
#logger
raise
我正在记录并再次引发异常..
我的errors.py 中还有一个错误处理程序,用于处理中止的函数:
def error_handler(app):
@app.errorhandler(400)
def bad_request_error(error):
description = getattr(error, 'description', 'Bad request')
return jsonify({'error': 'Bad request', 'message': description}), 400
这是传统的做法吗?将函数直接中止到
my_function()
中的 except 块中是否更优化?
良好的设计将错误处理逻辑与业务逻辑分开。 您可以通过使用为您的业务领域定义的自定义异常并将错误处理逻辑转移到 Flask 来实现这一点。
class MyEndpoint(Resource):
def post(self):
return my_function()
my_function
可以重构以引发自定义错误,例如BusinessLogicException
。
class BusinessLogicException(Exception):
def __init__(message):
super().__init__(message)
def my_function():
# ...
raise BusinessLogicException('Could not perform some business operation.')
您可以为执行域逻辑时引发的异常注册一个错误处理程序,并返回适当的响应。
您可以在 Apache Superset 项目中看到类似的设计模式。
def error_handler(app):
@app.errorhandler(BusinessLogicException)
def my_function_exception(ex):
description = getattr(ex, 'message', 'Bad request')
return jsonify({'error': 'Bad request', 'message': description}), 400