Welche Art von Exception abfangen bei os.makedirs

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.
Antworten
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

In einem Modul schreibe ich eine Datei in ein Verzeichnis, das möglicherweise noch nicht existiert. Mit os.makedirs stelle ich die Existenz des Verzeichnisses (einigermaßen) sicher. Falls das Verzeichnis bereits existiert erhalte ich eine Exception die ich ignoriere.

Code: Alles auswählen

def _create_path(foldername):
    try:
        os.makedirs(foldername)
    except Exception:
        pass
Das Abfangen der generischen Exception ist jetzt natürlich sehr breit angelegt. Das Problem beim Abfangen einer spezialisierteren Ausnahme ist allerdings, dass unterschiedliche Betriebssysteme bei dieser Funktion unterschiedliche konkrete Ausprägungen von Exceptions werfen. Natürlich kann ich mehrere unterschiedliche Exceptions einfangen, aber die müsste ich erst einmal alle finden und dann auch noch davon ausgehen, dass in den nächsten Jahren nicht noch mehr hinzukommen.

Daraus ergeben sich folgende kurze Fragen: Lasse ich es einfach so? Gibt es Alternativvorschläge?
Benutzeravatar
sparrow
User
Beiträge: 4535
Registriert: Freitag 17. April 2009, 10:28

Hm, es könnte ja auch ein Rechteproblem vorliegen, dass dir also gar nicht erlaubt ist das Verzeichnis zu erstellen. Außerdem könnten Inodes oder Plattenspeicher ausgehen.

Ich würde das also nicht so lassen, denn bisher gehst du davon aus, dass das Verzeichnis da ist wenn es einen Fehler gibt, falls ich dich richtig verstehe.

Eine Alternative wäre zu prüfen ob das Verzeichnis schon da ist (os.path.exists), und makedirs nur auszuführen, wenn es eben noch nicht da ist. Wenn es dann zu einem Fehler kommt kannst du zumindest sicher sein, dass das Erstellen nicht erfolgreich war, und der Grund dafür nicht die vorhergehende Existenz ist.

Code: Alles auswählen

def _create_path(foldername):
    if not os.path.exists(foldername):
        try:
            os.makedirs(foldername)
        except Exception:
            print "Fehler beim Anlegen des Verzeichnisses!"
Zuletzt geändert von sparrow am Montag 12. November 2012, 12:37, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sparrow hat geschrieben:Hm, es könnte ja auch ein Rechteproblem vorliegen, dass dir also gar nicht erlaubt ist das Verzeichnis zu erstellen. Außerdem könnten Inodes oder Plattenspeicher ausgehen.
Das Problem ist mir bewusst (deshalb schrieb ich: "einigermaßen") und ich gehe es auf übergeordneter Ebene an, da in dem Fall das Programm kontrolliert abbrechen soll.
sparrow hat geschrieben:Eine Alternative wäre zu prüfen ob das Verzeichnis schon da ist (os.path.exists), und makedirs nur auszuführen, wenn es eben noch nicht da ist.
Ich möchte hier auch das EAFP-Prinzip anwenden. Bei der von dir beschriebenen Vorgehensweise könnte ich zudem immer noch auf eine Race Condition stoßen.
Benutzeravatar
sparrow
User
Beiträge: 4535
Registriert: Freitag 17. April 2009, 10:28

Mir wäre es zu unsicher das Programm in dieser "Unsicherheit" zu lassen, egal was das Mantra vorgibt.
Wenn du Angst vor einer RaceCondition hast, könntest du in der Behandlung der Exception einmal nachschauen ob das Anlegen des Verzeichnisses erfolgreich war.

Code: Alles auswählen

def _create_path(foldername):
    try:
        os.makedirs(foldername)
    except Exception:
        if not os.path.exists(foldername):
            raise
lunar

@/me Nutze entweder Python 3.3 und fange "FileExistsError" ab, oder fange "EnvironmentError" ab und vergleiche das "errno" Attribut des Ausnahmeobjekts mit "errno.EEXIST". In diesem Fall - und nur in diesem Fall - ist das Anlegen gescheitert, weil das Zielverzeichnis bereits existiert.
Antworten