2016-05-20 44 views
0

我正在編寫一個上下文管理器,以允許捕獲某種類型的異常。用戶定義類型與內置類型比較

class AssertRaises(object): 
    def __init__(self, exc_type): 
     self.exc_type = exc_type 

    def __enter__(self): 
     pass 

    def __exit__(self, exc_type, exc_val, exc_tb): 
     if exc_type == self.exc_type: 
      raise AssertionError 
     return True 

這個經理工作正常時,內置的異常升高,但失敗,這種用法:

class MyTypeError(TypeError): 
    pass 


try: 
    with AssertRaises(TypeError): 
     raise MyTypeError() 
except Exception as e: 
    print(type(e).__name__) 

在這個例子中,用戶自定義excepton提高,但是這個例外是相當於類型錯誤,我想它由上下文管理器處理爲TypeError。 我檢查了`isinstance(MyTypeError(),類型錯誤)==真」,並希望

__exit__(...) 

以相同的方式工作(考慮繼承)。有沒有解決方法?

+1

平等不能測試子類沒有,這就是'issubclass()'是。 –

+0

請注意,您不應該使用'=='來測試類; 'issubclass(Class,Class)'也將返回true(一個類被認爲是它自己的一個子類)。在測試中不要使用== True;這已經暗示了。因此,不是'如果some_test == True:'使用'如果some_test:',而反過來是'如果不是some_test:'。 –

+0

謝謝你的幫助。我認爲這是我尋找/ – Coconut

回答

0

無論是檢查例外本身(exc_val)如你與isinstance()完成,或使用issubclass()

def __exit__(self, exc_type, exc_val, exc_tb): 
    if issubclass(exc_type, self.exc_type): 
     raise AssertionError 
    return True