Bei Nutzung des `with`-Statements würde Python hier zunächst versuchen, die Datei zu öffnen. Schlägt dies fehl, dann wird eine Ausnahme geworfen und der Block wird nicht ausgeführt.
So, was passiert aber nach erfolgreichem Öffnen? Zunächst wird im Regelfall der Rückgabewert des `open()`-Aufrufs ja noch mittels `as` an einen Namen gebunden. Also z.B.:
Das ist bis zu dem Punkt noch nicht soviel anders als ein:
Der Unterschied ist bei `with` aber, dass nach Verlassen des Blocks ein Aufruf von `.close()` auf dem Objekt garantiert wird - egal ob innerhalb des Blocks eine Exception geworfen wurde oder ob alles gut gegangen ist. Im Grunde entspricht das Ganze einem:
Wenn du jetzt aber 100% äquivalenten Code schreiben würdest (also ohne `with`), dann müsstes du auch bedenken, dass es bei einem fehlerhaften `open()`-Aufruf gar nicht erst zum Erstellen von `stream` käme. Es würde dann nämlich dein `finally`-Block einen `NameError` werfen, da `stream` gar nicht bekannt wäre. Heißt also daher:
Code: Alles auswählen
try:
stream = open(filename)
# ein bißchen code ...
finally:
try:
stream.close()
except NameError:
pass
Und um dir das alles zu ersparen, wurde das `with`-Statement eingeführt, welches im Übrigen für alle möglichen Situationen verwendet werden kann, die irgendwie was mit Öffnen und Schließen zu tun haben (z.B. bei einer Verbindung zu einem Server und sowas).
Und ja, eine Ausnahme, die in dem `with`-Block auftritt, ist auch nach außen hin sichtbar.