2014-10-07 152 views
0

我在使用lookup(self, key)提出的两个例外时遇到了困难。两者都是ValueError例外,但意味着完全不同的东西。我如何分别捕获这些异常,因为它们是相同类型的异常,但在捕获它们时需要不同的行为?谢谢!Python捕捉异常

@staticmethod 
def _lookup_in_child(child, key): 
    if child: 
     return child.lookup(key) 
    else: 
     raise ValueError("Key not in tree: " + repr(key)) 

def lookup(self, key): 
    if key is None: 
     raise ValueError("None cannot be used as a key") 
    if self.key is None: 
     raise ValueError("Key not in tree: " + repr(key)) 

    if key < self.key: 
     return self._lookup_in_child(self.left, key) 
    elif key > self.key: 
     return self._lookup_in_child(self.right, key) 
    else: 
     return self 
+0

你是'lookup'方法的创造者吗?如果您可以将两个子类设置为“ValueError”并适当提高它们。 – metatoaster 2014-10-07 02:33:29

+1

看起来好像“LookupError”对于“不在树中的密钥”错误是更好的选择。 – BrenBarn 2014-10-07 02:37:55

+0

nope,我正在处理一个使用BinarySearchTree作为容器实现TreeDict的任务。我必须抓住这两个例外 – Jnk 2014-10-07 02:41:52

回答

1

我不确定你想要完成什么。例如,在调用lookup之前,你不能检查关键字是否为None吗?假设你需要捕获异常,下面将这样做,然后你可以添加你需要根据什么逻辑上的具体例外情况:

try: 
    lookup(key) 
except ValueError, e: 
    if str(e) == 'None cannot be used as a key': 
     print 'None case' 
    elif str(e).startswith('Key not in tree:'): 
     print 'Nonexistent case' 
    else: 
     print 'Default case' 
0

实施者显然认为这两个错误条件将被处理的同样的,也没有理由添加一些东西来区分它们。将其与IOError对比,其中包括数字代码。它很破烂和脆弱,但你可以通过查看异常对象的消息属性来区分它们。