2014-10-07 185 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對比,其中包括數字代碼。它很破爛和脆弱,但你可以通過查看異常對象的消息屬性來區分它們。