【发布时间】:2016-11-14 21:37:03
【问题描述】:
我是一名初学者,正在开发一个简单的基于卡片的 GUI。用 Python 编写。有一个基类,其中包括所有卡片的词汇表,例如_cards = {'card1_ID': card1, 'card2_ID': card2}。 GUI 上的卡片由其唯一 ID 引用。
由于我计划使代码对其他初学者可用,我想明确告知他们是否提供了不存在的卡 ID(而不是抛出 KeyError)。现在我有大量重复的 try-expect 子句让我怀疑:
部分代码,一行方法无需try-catch:
def shift(self, card_ID, amount):
"""Moves the card by the given amount of pixels.
:param amount: the horizontal and vertical amount of shifting in pixels; tuple"""
try:
self._cards[card_ID].shift(amount)
except KeyError:
raise ValueError("Invaild card ID")
def align(self, card_ID, horizontal, vertical):
"""Aligns the card to the given position."""
try:
card = self._cards[card_ID]
card.align(horizontal, vertical)
except KeyError:
raise ValueError("Invaild card ID")
def invert(self, card_ID):
"""Inverts the card's colour"""
try:
self._cards[card_ID].invert()
except KeyError:
raise ValueError("Invaild card ID")
这是一种公认的做法吗?有没有更好的方法在类的每个方法中捕获这个 KeyError ?
【问题讨论】:
-
另一种方法是覆盖 _cards 实例的 _getitem_。
-
当您想要的是
ValueError时,您是否有理由为您的卡片集合使用引发KeyError的对象?或者,您为什么首先想要ValueError?为什么不在代码中使用类的位置捕获KeyError而不是ValueError?如果问题是自定义错误消息,最好的办法是创建自己的CardsCollection类型,并内置自己的错误消息。
标签: python python-3.x exception exception-handling