本文正在参加「金石计划 . 瓜分6万现金大奖」
使用 raise 方法替代 if-else 处理,是一种代码思路,目的是简化代码逻辑,提高方法的复用性。这里不赞同所有的 if-else 都能被 raise 替代,使用时,也要考量实际的应用场景是否合适。
最近写接口 API 时,总是要使用 if-else 判断每一步业务逻辑,比如获取用户信息的 API 接口,就要依次判断 token 的有效性,用户表是否存在,用户是否存在等,如下示例代码:
def get_user_info(token):
st, partner, account = check_token(token)
if not st:
return error
user_db = get_user_db(partner)
if isinstance(user_db, type(None)):
return error
st, user = user_db.get_user(account)
if not st:
return error
return user
那么,有什么办法可以去掉这些判断,让代码简单明了呢?理想效果如下示例代码所示:
def get_user_info(token):
partner, account = check_token(token)
user_db = get_user_db(partner)
user = user_db.get_user(account)
return user
上面代码中,使用 if-else 语句,排除不是期望的结果。那么,把不是期望的结果定义成异常,就可以使用 raise 来抛出异常。为什么使用 raise 呢?那是因为 try-except 可以处理多个异常的特性。
如果一个代码片段可能会抛出多个不同的异常,那么使用 try-except 方法就可以捕获所有异常,避免创建大量重复代码,如下示例代码:
def get_user_info(token):
try:
partner, account = check_token(token)
user_db = get_user_db(partner)
user = user_db.get_user(account)
return user
except Exception as e:
return e
每个方法的错误结果就可以在其内部实现,比如 check_token() 方法:
def check_token(token):
if token == '':
raise Exception('token is not null')
# .... 其他逻辑等
方法中的 raise 可是一直向上层抛出,直到遇到 try-except 停止(如果一直没有遇到,就会结束程序)。基于这个特性,遇到方法嵌套方法的情况下,就不需要每次都用 try-except 捕获异常,然后再用 raise 抛出,如下示例代码:
def check_token_again(tokne):
# 不需要 try-except
check_token(token)
# 其他业务逻辑
# 执行方法
try:
check_token_again('')
except Exception as e:
print(e) # token is not null
到这里,大致可以得出结论,遇到错误结果时,使用 raise 抛出,在 try-except 中调用方法,可以省去 if-else 判断,简化代码逻辑。此外,使用 raise 的方法,可以在多个地方使用,也不需要使用 if-else 判断错误结果,提高了方法的复用性。
参考: