Zum Beispiel im Konstruktor muss ich einige Ressourcen greifen, die fehlschlagen könnten, in diesem Fall sollte die Klasse nicht instanziiert werden.In Python, was ist der richtige Weg, um eine Klasse zu implementieren, deren Konstruktor fehlschlagen könnte?
Sollte ich Exception im Konstruktor auslösen?
class Foo(object):
def __init__(self):
self.rsc = get_resource():
assert self.rsc
Und versuchen, es im Instanziierungscode zu fangen?
try:
a = Foo()
except:
a = None
Dann überprüft später Code, ob a keiner ist.
besser, nur 'rsc' als Konstruktor Parameter hinzufügen, die in übergeben wird. Als Ergebnis erhalten Sie zwei Vorteile: einen leichteren Konstruktor und einen, der nicht ausfallen kann. Wenn Sie möchten, können Sie eine Funktion bereitstellen, die die Ressource implizit abruft und entweder None zurückgibt oder den Konstruktor mit der Ressource aufruft. – amalloy
Was Sie vorgeschlagen haben, klingt gut. Die Frage ist, was passiert, wenn dieser Fehler auftritt. Wenn es der aufrufende Code ist, der damit umgehen muss, sollten Sie die Ausnahme im aufrufenden Code abfangen, wie Sie es vorgeschlagen haben. – BrenBarn