如何在Python try语句满足条件时执行对应自定义异常类逻辑
原代码问题说明
你写的代码有几个逻辑错误,根本达不到按条件分流执行的效果:
- 自定义异常类写法错误:直接写在类定义下的
print和业务逻辑会在代码加载、类定义的时候就执行,不是你抛出异常的时候才跑 - 异常判断逻辑完全无效:
client.exceptions.NoSuchEntityException是SDK定义的异常类本身,直接放在if判断里永远是真值,根本没有真的捕获到接口调用抛出的异常 - 异常捕获范围错了:
client.get_user()的调用写在了try块外面,接口抛错的时候直接就中断了,根本进不到你后面写的条件判断 - 裸
except会吞掉所有异常:不管你抛的是哪个自定义异常,最后都会走到print ('no action required')的分支,分流完全失效 - 代码里用到的
name变量没有定义,运行时会直接报NameError
正确实现方案
核心思路:
- 把可能抛错的接口调用放进try块,先接住SDK抛出的用户不存在异常,再在这个分支里判断你的第二个条件,符合哪个条件就抛出对应的自定义异常
- 自定义异常只做类型标识,对应场景的业务逻辑写在单独的异常捕获分支里,抛出对应异常后会自动跳过try块内剩余代码、跳过其他异常分支,只执行匹配到的分支逻辑
- 不要用无差别的裸except,避免吞掉非预期的报错
修正后的可运行代码如下:
import boto3 # 自定义异常仅做场景类型区分,不要在类定义层写业务逻辑 class BothNotExist(Exception): pass class UserNotExist(Exception): pass def lambda_handler(event, context): client = boto3.client('iam') # 注意替换成你业务里实际的name取值,原代码中该变量未定义 name = "业务逻辑内获取到的实际name值" check_username = 'Tom' try: # 可能抛出异常的接口调用必须放在try块范围内 client.get_user(UserName=check_username) # 接口没抛错说明用户存在,在这里写用户存在时的逻辑即可 print(f"用户{check_username}校验通过,存在于IAM中") except client.exceptions.NoSuchEntityException: # 走到这里说明IAM用户不存在,再根据name的条件分流抛对应异常 if 'Test05' not in name: raise BothNotExist("用户与服务关联均不存在") if 'Test05' in name: raise UserNotExist("用户不存在但服务关联存在") # 两个自定义异常分别捕获,匹配到任意一个就只执行对应分支逻辑,其余分支自动忽略 except BothNotExist: print('the user and the service connection do not exist') # 在此处写BothNotExist场景下的所有业务操作 except UserNotExist: print('the user does not exist but the service connection exists') # 在此处写UserNotExist场景下的所有业务操作 # 兜底捕获其他非预期错误,不要直接静默吞错 except Exception as e: print(f"执行过程中触发非预期错误: {str(e)}") raise e
注:如果不需要自定义异常,也可以直接在捕获到NoSuchEntityException后的条件分支里直接写对应逻辑,不用额外抛异常再捕获,效果完全一致。
内容的提问来源于stack exchange,提问作者liyas
相关产品推荐
相关产品推荐

