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!它越来越清晰:)