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?
Gleichheit kann nicht für Unterklassen testen nein, das ist es, was 'issubclass()' ist für. –
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:'. –
Vielen Dank für Ihre Hilfe. Ich denke, das ist die Funktion, nach der ich gesucht habe. – Coconut