Python 使用条件返回重构代码
在我的项目中,我在多个函数的开始部分使用了这段代码Python 使用条件返回重构代码,python,Python,在我的项目中,我在多个函数的开始部分使用了这段代码 try: user = get_user(user_id) except LockedException: logger.warn('op=healthcheck, msg="user is locked"') return HttpResponseServerError(jsonMessage('user=%(user)s is locked' % {'user': user_id})) except Use
try:
user = get_user(user_id)
except LockedException:
logger.warn('op=healthcheck, msg="user is locked"')
return HttpResponseServerError(jsonMessage('user=%(user)s is locked' % {'user': user_id}))
except UserFreeException:
logger.warn('op=user, msg="user is free"')
return HttpResponseNotFound(jsonMessage('user is free user=%(user)s' % {'user': user_id}))
except User.DoesNotExist:
logger.warn('op=healthcheck, msg="user doesn\'t exist"')
return HttpResponseNotFound(jsonMessage('invalid user=%(user)s' % {'user': user_id}))
except Exception, e:
logger.error('op=healthcheck, msg="unknown error", msg="%(exception)s"',
{'exception': e.message})
return HttpResponseServerError(jsonMessage(e.message))
有没有关于如何重构它的提示,这样我就不需要在任何地方重用它?
我最好创建一个函数,在出现问题时抛出一个异常,这个异常包含一个“http_response”字段,因此我会执行以下操作:
try:
user = get_user(user_id)
except MyGenericException, e:
return e.http_response
还有其他想法吗?更新了@steveha的建议
在函数中使用它怎么样:
def safe_get_user(user_id):
user = error_response = None
try:
user = get_user(user_id)
except LockedException:
logger.warn('op=healthcheck, msg="user is locked"')
error_response = HttpResponseServerError(jsonMessage('user=%(user)s is locked' % {'user': user_id}))
except UserFreeException:
logger.warn('op=user, msg="user is free"')
error_response = HttpResponseNotFound(jsonMessage('user is free user=%(user)s' % {'user': user_id}))
except User.DoesNotExist:
logger.warn('op=healthcheck, msg="user doesn\'t exist"')
error_response = HttpResponseNotFound(jsonMessage('invalid user=%(user)s' % {'user': user_id}))
except Exception, e:
logger.error('op=healthcheck, msg="unknown error", msg="%(exception)s"',
{'exception': e.message})
error_response = HttpResponseServerError(jsonMessage(e.message))
return user, error_response
然后,无论你想在哪里执行它:
user, error_response = safe_get_user(user_id)
if error_response is not None:
return error_response
也许是一个在修饰函数的函数体之前执行此逻辑的修饰器?与其检查类型,我更喜欢返回一个结果元组:
(good\u result,error\u result)
成功后,返回None
作为error\u result
部分;失败时,返回None
作为good\u结果
部分。然后是if error\u result:return error\u result
我喜欢,谢谢@steveha!它越来越清晰:)