dedlfix: (PYTHON) Exception in __init__ - Objekt erzeugt oder nicht?

Beitrag lesen

print begrüßung

Im try-Block wird das Objekt foo_object erzeugt. Danach wird zwangsläufig __init__ aufgerufen. In diesem Moment existiert das Objekt, wie sich ja auch dadurch zeigt, dass in Deinem Beispiel die __init__-Methode die do_something-Methode erfolgreich aufruft.
Dann wird die Exception ausgelöst. Der Python-Interpreter betrachtet den try-Block nun nicht mehr als den auszuführenden Zweig und macht die Anweisung rückgängig, durch die die Exception ausgelöst wurde (das erzeugte Objekt wird vernichtet). Dann wird der except-Zweig ausgeführt.
Stimmt das so?

Nicht ganz. Um Dinge rückgängig machen zu können müsste der vorherige Zustand irgendwo notiert werden. Das ist zu aufwendig um das automatisch und damit ständig zu machen. In deinem Fall wird das Objekt erzeugt und seine Initialisierung durchgeführt, aber die anschließende Zuweisung zur Variablen kann nicht mehr stattfinden, weil durch die Exception der Fluss unterbrochen wird. Als Lösung schlage ich vor, die von foo_object abhängigen Operationen in einem else-Zweig zu notieren.

try:  
    foo_object = foo()  
except RuntimeError, strerror:  
    print strerror  
else:  
    foo_object.do_something()

print "%s %s" % (verabschiedung, name)