如何才能在全球范围内处理瓶中的异常?我找到了使用以下方法处理自定义db交互的方法:
try:
sess.add(cat2)
sess.commit()
except sqlalchemy.exc.IntegrityError, exc:
reason = exc.message
if reason.endswith('is not unique'):
print "%s already exists" % exc.params[0]
sess.rollback()try-except的问题是,我必须在代码的每个方面运行它。我可以为定制代码找到更好的方法。我的问题更多地是针对以下方面的全球捕获和处理:
apimanager.create_api(
Model,
collection_name="models",
**base_writable_api_settings
)我发现这个apimanager接受validation_exceptions:ValidationError,但是我没有找到使用它的例子。
我仍然想要一个更高层次的处理,用一个简单的概念“如果这个错误:显示这个,如果另一个错误:显示其他什么”来处理影响所有db交互的更高层次,它只在所有交互/异常上自动运行,而不包括在每个apimanager上(我想把它放在我的base_writable_api_settings中很好)。(IntegrityError、NameError、DataError、DatabaseError等)
发布于 2016-07-29 16:11:53
我倾向于在应用程序上设置一个错误处理程序,将异常格式化为json响应。然后您可以创建像UnauthorizedException这样的自定义异常..。
class Unauthorized(Exception):
status_code = 401
@app.errorhandler(Exception)
def _(error):
trace = traceback.format_exc()
status_code = getattr(error, 'status_code', 400)
response_dict = dict(getattr(error, 'payload', None) or ())
response_dict['message'] = getattr(error, 'message', None)
response_dict['traceback'] = trace
response = jsonify(response_dict)
response.status_code = status_code
traceback.print_exc(file=sys.stdout)
return response您还可以使用此模式处理特定的异常..。
@app.errorhandler(ValidationError)
def handle_validation_error(error):
# Do something...错误处理程序被附加到应用程序,而不是apimanager。你可能有这样的东西
app = Flask()
apimanager = ApiManager(app)
...用那个应用程序对象把这个放到某个地方。
发布于 2016-07-29 16:12:15
我最喜欢的方法是使用装饰过的视图函数。
您可以定义一个装饰师,如下所示:
def handle_exceptions(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except ValidationError:
# do something
except HTTPException:
# do something else ...
except MyCustomException:
# do a third thing然后,您可以简单地装饰您的视图-功能,例如。
@app.route('/')
@handle_exceptions
def index():
# ...不幸的是,我不知道钩子,水瓶-无休止的提供传递视图-功能。
https://stackoverflow.com/questions/38662960
复制相似问题