【发布时间】:2014-11-09 19:40:02
【问题描述】:
我的问题是关于最好的(最“pythonic”的)异常处理方式,以防一个方法可以引发两种(或更多)类型的异常,但从调用者的角度来看它们的解释是相同的。
假设我有一个命名(名称是字符串)对象的集合。我希望这个集合能够按索引或名称返回项目。
class CollectionOfNamedItems:
def __init__(self, items):
self._dict = {item.name: item for item in items}
self._items = tuple(items)
def __getitem__(self, item):
if isinstance(item, str):
return = self._dict[item] # may raise KeyError
return self._items[item] # may raise IndexError
# usage: collection['X'] or collection[1]
我的问题是:根据我们是按索引还是按名称访问项目,__getitem__ 方法会引发IndexError 或KeyError。这是引发异常的好方法吗?此方法的调用者必须捕获这两种类型的异常。或者在__getitem__ 中捕获KeyError 和IndexError 并引发ValueError (或其他一些?)会更好(可以说更pythonic),这样调用者就可以只捕获一种类型的异常,而不管传递的参数类型。
def __getitem__(self, item):
try:
if isinstance(item, str):
return = self._dict[item] # may raise KeyError
return self._items[item] # may raise IndexError
except (KeyError, IndexError):
raise ValueError('invalid item')
另一方面,当我调用collection[1.5] 或collection[None] 时,抛出TypeError 似乎是合乎逻辑的。这是因为我觉得解释与上面的错误不同。
如果对此主题有任何意见或想法,我将不胜感激。
【问题讨论】:
-
这个问题可能更适合Programmers 或Code Review 堆栈交换站点。
标签: python exception exception-handling