You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:24:16