首页 > 解决方案 > Python 和 EAFP 原理:有什么方法可以区分相同类型的 2 个异常?

问题描述

我有以下代码:

    try:
        player.board[move][player.board[move].index(None)] = chosen_card
        player.cards.remove(chosen_card)
    except ValueError:
        print("This row already has 3 cards!") # There is no None in array
        print("Player doesn't have such card!") # can't remove a card player doesn't have
    except IndexError:
        print("Invalid board index") # move is bigger than 9 or smaller than 0

那个部分:

player.board[int(move)].index(None)

如果数组中没有None可以抛出 ValueError。

那个部分

player.cards.remove(chosen_card)

如果没有要删除的对象,也可以抛出 ValueError 。

有什么方法可以确切地知道是什么引发了 ValueError 并处理它(例如,如果这样做了 -> 如果这样做了,则执行此操作 -> 执行此操作)?

我尝试将这些行分成两个 try except 块,但是如果第二个块引发异常,则第一个执行(卡放在板上)并且不应该因为玩家没有卡。

我知道我可以先检查所有这些条件然后执行,但我想以 Python 的方式编程所有内容,并牢记 EAFP 原则。

另外,如果有更好的设计理念来编程这部分,也请分享。

标签: pythonexception

解决方案


一种可能不是最简单的方法是创建一个自定义类来实现您想要的。这是一种常见的方式来抛出一个更 Pythonic 的错误以被开发人员捕获。

IE:

class BoardValueError(ValueError):
    pass

这样,您还可以在 try/except 子句中使用 try/except 来区分这两种异常。

(示例中的此类可以通过使用BoardValueErrororValueError或其任何父母来捕获)

注意:在一个块 try/except 中,即使第二条指令抛出错误,这也不会“回滚”第一条指令。所以卡片仍然会被添加到董事会。您可能需要在程序中实现回滚逻辑,使用两个异常块不会有太大变化,并且可能是最简单的方法。


推荐阅读