python - 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 原则。
另外,如果有更好的设计理念来编程这部分,也请分享。
解决方案
一种可能不是最简单的方法是创建一个自定义类来实现您想要的。这是一种常见的方式来抛出一个更 Pythonic 的错误以被开发人员捕获。
IE:
class BoardValueError(ValueError):
pass
这样,您还可以在 try/except 子句中使用 try/except 来区分这两种异常。
(示例中的此类可以通过使用BoardValueError
orValueError
或其任何父母来捕获)
注意:在一个块 try/except 中,即使第二条指令抛出错误,这也不会“回滚”第一条指令。所以卡片仍然会被添加到董事会。您可能需要在程序中实现回滚逻辑,使用两个异常块不会有太大变化,并且可能是最简单的方法。
推荐阅读
- grafana - InfluxDB 和 Grafana 的基本 where 子句
- java - JPA 和按多个日期搜索
- docker - Kubernetes 在执行 docker pull 时忽略 config.json
- javascript - JS,React - 获取元素中文本的高度
- spring - 意外的返回值
- sql - 我可以在 SSIS 作业中使用“LIKE”语句来检查文件名是否存在吗?
- java - 在处理中制作随机矩形
- c - 如何使用这个 Arduino 演示串行读取更大的数据类型?
- python - 在 python 集中对几个编号的变量进行分组
- jestjs - puppeteer page.goto api 无法加载 URL