为了简化代码逻辑,我使用了 raise

239 阅读2分钟

本文正在参加「金石计划 . 瓜分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 判断错误结果,提高了方法的复用性。

参考

python3-cookbook.readthedocs.io/zh_CN/lates…

python3-cookbook.readthedocs.io/zh_CN/lates…