首页 > 解决方案 > 可以在代码中使用异常作为条件吗?

问题描述

我正在使用 Sqlalchemy 和 Fastapi,并且在其中一个数据库模型中,我将唯一约束设置为 slug 列。所以每次有人试图设置已经存在的 slug 时,代码都会抛出一个 IntegrityError。我正在使用该 except 块来创建一个随机 slug 并递归调用该函数。以下是我的部分代码。

    def create(self,
           member_in: MemberCreateRequest, ) -> Member:
    print("[+] CREATE Member")
    try:
        member_item = Member(
            name=member_in.name,
            email=member_in.email,
            username=member_in.username,
            slug=member_in.slug,
        )
        self.session.add(member_item)
        self.session.commit()
        self.session.refresh(member_item)
        return member_item
    except IntegrityError as e:
        self.session.rollback()

        # add some random number to slug and try adding it again
        if "UNIQUE constraint failed: member.slug" in e.args[0]:
            member_in.slug = "{slug}-{random_number}".format(
                slug=member_in.slug, random_number=randint(100, 999)
            )
            return self.create(workspace_id, member_in)
        else:
            raise e

我想知道以这种方式使用 except 块是否可以。如果不能,您能否指出当前方法有什么问题以及我可以做些什么来使它变得更好?

谢谢你。

标签: pythonsqlalchemyfastapi

解决方案


可以在代码中使用异常作为条件吗?

您在问是否可以使用except类似于块的else块。

基本上,您正在处理代码。一般来说,软件工程有两种方法。

  1. LBYLif: Look Before You Lead - 这意味着通过添加-else检查来避免异常。
  2. EAFP:比许可更容易请求宽恕 -try一些东西,然后except是异常并处理它。

你正在做的是EAFP。考虑一个except等效于ifelse块的块是完全可以的。


推荐阅读