2014-06-18 23 views
-2

爲什麼不能通過ValueError訪問「class」AttributeError'「,或者真的有辦法做到這一點我不知道?ValueError vs acessing sys.exc_info()

我需要像在下面的代碼中那樣調用sys.exec_info()來訪問有關錯誤地調用某個類的某個方法的屬性的信息,但ValueError本身無法提供此信息。

只是爲了進一步解釋我自己 - 當方法列表取決於使用類創建的實例的屬性(以及實例的方法)時,我遇到了一種情況,因此擁有一個簡單和標準的句柄如果創建「統一」實例,由於不恰當地調用實例的方法或屬性而導致的錯誤將是在代碼中銷售一些分支並在未使用的方法和屬性上節省內存的有效方法。

我在下面的代碼中演示了不正確的屬性調用,但同樣適用於這些方法。

#!/usr/bin/python3 
import sys 

class Number(): 
    def __init__(self, real, im=0): 
     if im == 0: 
      self.real=real 
     else: 
      self.real=real 
      self.im=im 

x=Number(10) 

'''#this part does not work 
try: 
    print(' x = ', x.real, " + ", x.im, 'i') 
except ValueError as err: 
    print(err) 
''' 
try: 
    print(' x = ', x.real, " + ", x.im, 'i') 
except: 
    print(sys.exc_info()[0]) 
+1

如果你期待一個'AttributeError'(看起來很可能),爲什麼不'除了AttributeError as err:'? – jonrsharpe

+1

'ValueError' **與'AttributeError'不是同一個類**。你爲什麼期望'ValueError'捕獲'AttributeError'異常? –

回答

0

AttributeError不是ValueError一個子類,所以當你只處理前者在後者上沒有被捕獲。

她倆如果你需要同時處理異常:

try: 
    print(' x = ', x.real, " + ", x.im, 'i') 
except (AttributeError, ValueError) as exc: 
    print(exc) 

或正好趕上AttributeError

try: 
    print(' x = ', x.real, " + ", x.im, 'i') 
except AttributeError as exc: 
    print(exc) 

如果你想追上(幾乎)所有的異常,趕上Exception

except Exception as exc: 

但要小心blanket, Pokemon exception handling