Variabler Dateiname

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ah ok, das kann sein. Hatte das nicht getestet.

Code: Alles auswählen

try:
    fobj = open(fname)
except OSError, e:
    print "Oh Oh, going down"
else:
    do_foo()
finally:
    fobj.close()
Nu aber ;)

@Zap: Weil dir ein `j` fehlt ;) Um das sauber zu schliessen, muesste es existieren, bei dir tritt das Problem nicht auf, weil dir das gleich beim oeffnen um die Ohren fliegt, wenn es ein Problem gibt.
Dass es bei `with` und `try ... finally` genauso scheitert, ist richtig, dass du das aber in Code aenderst, der dir sowieso um die Ohren fliegt, wenn was falsch laeuft macht ihn nicht richtiger, nur weil du das Problem verlagerst.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Code: Alles auswählen

IDLE 2.6.2      
>>> try: 
    fobj = open('MichGibtEsNicht') 
except OSError, e: 
    print "Oh Oh, going down" 
else: 
    do_foo() 
finally: 
    fobj.close()

Traceback (most recent call last):
  File "<pyshell#1>", line 8, in <module>
    fobj.close()
NameError: name 'fobj' is not defined
Dein letzter Vorschlag war besser.
MfG
HWK
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Ich nutzte seinerzeit ohne try/except/finally-Konstrukt gelegentlich ein c-ähnliches handling, falls die Ausnahmebehandlungen zu unübersichtlich wurden:

Code: Alles auswählen

fobj = None
try:
    fobj = open(...)
    code_mit_weiteren_ausnahmen()
finally:
    if fobj:
        fobj.close()
    else:
        # pseudo-exception
Hatte den Vorteil, daß "übersehene" Ausnahmen im Inneren trotzdem zum Vorschein kamen während das Dateiobjekt richtig behandelt wurde. Ist mit try/except/finally und with heutzutage viel einfacher.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Dann lieber so:

Code: Alles auswählen

try:
    fobj = open(fname)
    do_stuff(fobj)
except OSError, e: # ergänzt, damit cofi auch glücklich ist ;)
    print "Oh Oh, going down" 
finally:
    try:
        fobj.close()
    except NameError:
        pass
Ich bin allerdings der Meinung, dass das Öffnen einer Datei die Grundvorausausetzung für die weitere Bearbeitung ist und somit nicht in den selben try-Block gehört.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

War man nur am Abfangen der Dateiaktionen interessiert, ging es nach altem Muster auch so:

Code: Alles auswählen

try:
    fobj = open(...)
    try:
        weiterer_dateikram()
    finally:
        fobj.close()
except IOError, e:
    print e # oder was auch immer
Soweit nicht von weiterer_dateikram() behandelt, wurden hier allerdings alle IOErrors abgefangen.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

jerch hat geschrieben:War man nur am Abfangen der Dateiaktionen interessiert, ging es nach altem Muster auch so:

Code: Alles auswählen

try:
    fobj = open(...)
    try:
        weiterer_dateikram()
    finally:
        fobj.close()
except IOError, e:
    print e # oder was auch immer
Soweit nicht von weiterer_dateikram() behandelt, wurden hier allerdings alle IOErrors abgefangen.
Das hatte doch cofi bereits erwähnt.
MfG
HWK
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

HWK hat geschrieben:...
Das hatte doch cofi bereits erwähnt.
...
Upps, das hatte ich überlesen. :oops:
Wobei der IOError hier doch der wahrscheinlichere ist.
Antworten