Was passiert mit Exceptions, die in einem with-Statement-Ausdruck ausgelöst wurden?

8

Mein Verständnis von Pythons with Anweisung lautet wie folgt:

with statement = with + ausdruck + as + ziel + : + anzug

  1. Ausdruck wird ausgeführt und gibt einen Kontextmanager
  2. zurück
  3. context manager __enter__ gibt einen Wert an target zurück
  4. Die Suite wird ausgeführt.
  5. Die Methode __exit__ des Kontextmanagers wird aufgerufen

Ich weiß, Ausnahmen können in Schritt 2 und Schritt 3 behandelt werden, meine Frage ist, dass, wenn eine Ausnahme während des Schritts1 ausgelöst wird, wenn Ausdruck ausgeführt wird, kann ich einen Kontextmanager bekommen?

Wenn nicht, bedeutet das, dass die Anweisung with nur sicherstellt, dass suit ausgeführt wird und ordnungsgemäß schließt?

Wie with open("file") as f , wenn die Datei nicht existiert, was wird passieren?

    
vergil 18.06.2015, 07:49
quelle

1 Antwort

7

Die with -Anweisung verwaltet nur Ausnahmen in Schritt 3 . Wenn in Schritt 1 eine Exception ausgelöst wird (Ausführen von expression ) oder in Schritt 2 (Ausführen der Methode context manager __enter__ ), haben Sie keinen (gültigen und funktionierenden) Kontextmanager , um die Ausnahme an zu übergeben.

Wenn also die Datei nicht existiert, wird eine Ausnahme ausgelöst, die von einem Kontextmanager nicht bearbeitet werden kann, da dieser Kontextmanager nie erstellt wurde.

Wenn das ein Problem ist, können Sie den Ausdruck Teil immer separat ausführen:

%Vor%     
Martijn Pieters 18.06.2015, 07:58
quelle