【发布时间】:2015-03-27 20:55:27
【问题描述】:
上下文:我为不同的 API 端点定义了 Flask 路由,每个端点调用具有某些参数(uid、project_id 等)的控制器类。
@app.route('/sample/route', methods=['POST'])
@require_json_payload
@require_fields({
'pid',
'params'
})
def route_handler(arg1, arg2):
#input filtering
...
try:
proj_cntr.sample_method(
pid = pid,
... = ...
)
except ProjCntrException:
#handle error
#response generation
...
控制器(proj_cntr)负责确定给定的PID是否有效,是否允许给定的用户执行操作,以及其他业务逻辑验证。
我注意到我在不同的控制器中 c/粘贴了很多这样的代码:
if not project_object:
sys_logger.info('...')
raise ProjCntrException('PID %d does not exist' % pid)
将这些检查(验证)放在装饰器中似乎是最好的做法。但是如果验证不通过,我不确定哪种错误处理模式是最佳实践。
1) 我是否应该为每个装饰器创建特定的自定义异常(InvalidProjException、PermissionsException 等)以引发?
问题:调用方法的 catch 块会显得臃肿。另外,假设调用者知道被调用者的装饰器引发了哪些异常是不是很好?
2) 装饰器将额外的错误参数传递给方法,方法决定引发什么异常。这样调用者方法就知道期望和处理什么异常类型。
担忧:方法似乎有点过度设计和混乱。
抱歉这个冗长的问题。非常感谢任何想法/想法。
【问题讨论】:
标签: python exception error-handling flask