2016-05-20 9 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に相当し、私が欲しいですコンテキストマネージャーによってTypeErrorとして処理されます。 私は `でisinstance(MyTypeError()、例外TypeError)== TRUE」と

__exit__(...) 

は(継承を考慮すること)と同じように動作することを確認しました。解決策はありますか?

+1

平等ではありません、それは 'issubclass()は'のためにあるものだサブクラスのためにテストすることはできません。 –

+0

クラスのテストに '=='を使うべきではないことに注意してください。 'issubclass(Class、Class)'もtrueを返します(クラスはそれ自身のサブクラスとみなされます)。テストで '== True'を使わないでください。それは既に暗示されています。したがって、if some_test == Trueの代わりに 'some_test:'を使用し、 'inverse 'は' some_test: 'ではありません。 –

+0

ありがとうございます。私はこれが私が探していた機能だと思う/ – Coconut

答えて

0

どちらかあなたがisinstance()でやったように例外自体(exc_val)を確認、またはissubclass()を使用します。

def __exit__(self, exc_type, exc_val, exc_tb): 
    if issubclass(exc_type, self.exc_type): 
     raise AssertionError 
    return True 
関連する問題