2015-08-01 3 views
6

Ich weiß, dass die file.close() Methode in Python keinen Rückgabewert hat, aber ich kann keine Informationen darüber finden, ob in einigen Fällen eine Ausnahme ausgelöst wird. Wenn es das auch nicht tut, dann denke ich, dass der zweite Teil dieser Frage überflüssig ist.file.close() Ausnahmebehandlung innerhalb einer With-Anweisung in Python

Wenn ja, was wäre dann der "richtige" Weg, um die file.close()-Methode zu behandeln, die eine Exception in einer "with" -Anweisung zum Öffnen der Datei auslöst?

Gibt es eine Situation, in der file.close() sofort fehlschlagen kann, nachdem eine Datei geöffnet und erfolgreich gelesen wurde?

+0

Wenn Sie Python 2.5 oder höher verwenden, wird ein 'Mit'-Block automatisch die Datei für Sie schließen. In diesem Fall muss 'close() nicht explizit angegeben werden. – Daniel

+1

@Daniel, OP verwendet Python 3.x-Tag. @Bitrex Sie können den Fehler drucken, wenn es geschieht, indem Sie Ihre 'with'-Anweisung mit einem' try: exception, e: print (e) ' – awbemauler

+2

mit Anweisungen können Ausnahmen mit keine Möglichkeit, sie zu umgehen, außer durch Einwickeln in versuchen /außer.mit/außer wurde vorgeschlagen, aber abgeschossen. mit Aussagen sind syntaktische Zucker für einfache Anwendungsfälle, bei denen keine Ausnahme erwartet wird. Siehe http://stackoverflow.com/questions/8774830/how-with-is-better-than-try-catch-to-open-a-file-in-python für ausführliche Diskussion. –

Antwort

4

Ja, file.close() kann eine IOError Ausnahme auslösen. Dies kann passieren, wenn das Dateisystem zum Beispiel Kontingente verwendet. Siehe C close() function man page:

nicht den Rückgabewert von close() Überprüfung ist eine häufige, aber dennoch ernsthafte Programmierfehler. Es ist durchaus möglich, dass Fehler bei einem vorherigen write(2)-Vorgang zuerst bei der letzten close() gemeldet werden. Wenn der Rückgabewert beim Schließen der Datei nicht überprüft wird, kann dies zu einem Verlust von Daten führen. Dies kann insbesondere bei NFS und mit Datenträgerkontingent beobachtet werden.

Ein Nicht-Null-Rückgabewert der Funktion close() C führt zu Python eine IOError Ausnahme erhöhen.

Wenn Sie wollte diese Ausnahme behandeln, setzen Sie einen try...except Block um die with Aussage:

try: 
    with open(filename, mode) as fileobj: 
     # do something with the open file object 
except IOError as exc: 
    # handle the exception 

Natürlich haben die IOError auch während Öffnung geworfen werden können.

+0

'Natürlich könnte der IOError auch beim Öffnen ausgelöst worden sein. In diesem Fall verwenden Sie einen [' ExitStack'] (https://docs.python.org/3/library/contextlib.html#contextlib.ExitStack) um sicherzustellen, dass es [beim Beenden] ausgelöst wurde (https://docs.python.org/3/library/contextlib.html#catching-exceptions-from-enter-methods). – Navith

+1

@Navith oder öffnen Sie das Dateiobjekt zuerst und * dann * verwenden Sie es als Kontextmanager. –

-1

können Sie

verwenden
file object = open(file_name [, access_mode][, buffering]) 

Dann überprüfen Sie

file.closed 

It True zurück, wenn die Datei sonst und falsch geschlossen ist.

+0

Das fängt nicht einmal an, die Frage zu beantworten * macht 'file.close()' irgendwelche Ausnahmen? * Das OP fragt ** nicht, wie man überprüft, ob ein Dateiobjekt offen oder geschlossen ist. –

+0

Oh, Entschuldigung - ich habe das Q nicht gut gelesen. –

+0

Es ist alles gut; Willkommen in SO. Wenn Sie Fragen auf der Website beantworten, denken Sie daran, sie sorgfältig zu lesen, bevor Sie eine Antwort senden. Alternativ können Sie einen Kommentar zu der Frage hinterlassen, wenn Sie genug Reputation verdienen. – Daniel

1

close können Ausnahmen auslösen, z. B. wenn Sie nicht mehr genügend Speicherplatz haben, während Sie versuchen, Ihre letzten Schreibvorgänge zu löschen, oder wenn Sie den USB-Stick herausgezogen haben, auf dem sich die Datei befand.

Wie für den richtigen Umgang damit, hängt von den Details Ihrer Anwendung ab. Vielleicht möchten Sie dem Benutzer eine Fehlermeldung anzeigen. Vielleicht möchten Sie Ihr Programm herunterfahren. Vielleicht möchtest du das wiederholen, was du auch gemacht hast, aber mit einer anderen Datei. Egal welche Antwort Sie wählen, es wird wahrscheinlich mit einem try - except Block in welcher Schicht Ihres Programms am besten ausgestattet ist, um damit umzugehen.