2016-05-20 7 views
0

Ich schreibe einen Kontextmanager, der es ermöglicht, einen bestimmten Typ von Ausnahme abzufangen.Benutzerdefinierter Typ mit eingebautem Typvergleich

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 

Dieser Manager funktioniert gut, wenn integrierte Ausnahme wirft aber nicht mit einer solchen Nutzung:

class MyTypeError(TypeError): 
    pass 


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

In diesem Beispiel wird die benutzerdefinierte excepton erhöht, aber diese Ausnahme entspricht Typeerror und ich möchte Es wird vom Kontextmanager als TypeError verarbeitet. Ich habe, dass `isinstance (MyTypeError(), Typeerror) == True‘ und

wollen in der gleichen Art und Weise
__exit__(...) 

arbeiten (Vererbung betrachten). Gibt es eine Lösung?

+1

Gleichheit kann nicht für Unterklassen testen nein, das ist es, was 'issubclass()' ist für. –

+0

Beachten Sie, dass Sie '==' nicht verwenden sollten, um auf Klassen zu testen; 'issubclass (Class, Class)' gibt auch true zurück (eine Klasse wird als eine Unterklasse von sich selbst betrachtet). Und verwende nicht "== Wahr" in Tests; das ist bereits impliziert. Also anstelle von 'if some_test == True:' use 'wenn some_test:', und die Umkehrung ist 'if not some_test:'. –

+0

Vielen Dank für Ihre Hilfe. Ich denke, das ist die Funktion, nach der ich gesucht habe. – Coconut

Antwort

0

Entweder überprüfen Sie die Ausnahme selbst (exc_val), wie Sie mit isinstance() getan haben, oder verwenden Sie issubclass():

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